import 'dart:async'; import 'package:badge/control/scanner_controller_impl.dart'; import 'package:badge/model/flutter_blue_plus_device.dart'; import 'package:badge/model/device.dart'; import 'package:badge/control/scanner_controller.dart'; import 'package:flutter_blue_plus/flutter_blue_plus.dart'; class FlutterBluePlusScannerController extends ScannerControllerImpl { final StreamController> _scanResultsController = StreamController>.broadcast(); @override Stream> get scanResultsStream => _scanResultsController.stream; @override Future startScan({ Duration timeout = const Duration(seconds: 5), }) async { stopScan(); super.setStatus(ScanStatus.scanning); var subscription = FlutterBluePlus.scanResults.listen((results) { List devices = results .map((d) => FlutterBluePlusDevice.fromScan(d)) .toList(); _scanResultsController.add(devices); }); // either this, or the cancel in the finally block, should do the same? FlutterBluePlus.cancelWhenScanComplete(subscription); await FlutterBluePlus.startScan(timeout: Duration(seconds: 5)); await FlutterBluePlus.isScanning.where((val) => val == false).first; } @override Future stopScan() async { await FlutterBluePlus.stopScan(); } @override void dispose() { stopScan().ignore(); _scanResultsController.close(); } }