flutter_bluetooth.dart 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. library flutter_bluetooth;
  2. import 'dart:async';
  3. import 'dart:typed_data';
  4. import 'package:flutter/cupertino.dart';
  5. import 'package:flutter/services.dart';
  6. import 'package:rxdart/rxdart.dart';
  7. part 'bluetooth_device.dart';
  8. part 'bluetooth_socket.dart';
  9. class FlutterBluetooth {
  10. static const MethodChannel _channel =
  11. const MethodChannel('flutter_bluetooth');
  12. PublishSubject _stopScanPill = new PublishSubject();
  13. List<BluetoothDevice> _scanDevices;
  14. FlutterBluetooth._();
  15. static FlutterBluetooth _instance = new FlutterBluetooth._();
  16. static FlutterBluetooth get instance => _instance;
  17. Future<bool> get isEnabled async {
  18. final bool version = await _channel.invokeMethod('isEnabled');
  19. return version;
  20. }
  21. enabled() async {
  22. await _channel.invokeMethod('enabled');
  23. }
  24. Stream<List<BluetoothDevice>> startScan({List<int> filterClasses}) async* {
  25. await _channel.invokeMethod('startScan');
  26. _scanDevices = [];
  27. yield* EventChannel('flutter_bluetooth/scanEvents')
  28. .receiveBroadcastStream()
  29. .takeUntil(_stopScanPill)
  30. .map((item) {
  31. if (item['isCompleted']) {
  32. _stopScanPill.add(null);
  33. } else {
  34. var device = BluetoothDevice.fromJson(item["data"]);
  35. if (!_scanDevices.contains(device)) {
  36. if (filterClasses == null || _filterClass(device, filterClasses)) {
  37. _scanDevices.add(device);
  38. }
  39. }
  40. }
  41. return _scanDevices;
  42. });
  43. }
  44. stopScan() async {
  45. await _channel.invokeMethod('stopScan');
  46. _stopScanPill.add(null);
  47. }
  48. bool _filterClass(BluetoothDevice device, List<int> filterClasses) {
  49. return filterClasses.indexOf(device.deviceClass) >= 0;
  50. }
  51. }