startScan method
Implementation
Future<void> startScan({Duration? timeout}) async {
if (!_isInitialized) {
throw Exception(
'DeviceManager not initialized. Call initialize() first.');
}
if (_isScanning) {
throw Exception('Scan is already in progress');
}
if (FlutterBluePlus.adapterStateNow != BluetoothAdapterState.on) {
if (Platform.isAndroid) {
await FlutterBluePlus.turnOn();
await FlutterBluePlus.adapterState
.where((state) => state == BluetoothAdapterState.on)
.first
.timeout(const Duration(seconds: 10));
} else {
throw Exception('Bluetooth is not enabled');
}
}
_discoveredDevices.clear();
_isScanning = true;
try {
_scanSubscription = FlutterBluePlus.scanResults.listen((results) {
_discoveredDevices.clear();
for (final result in results) {
if (result.device.platformName.isNotEmpty) {
_discoveredDevices.add(OmiDevice.fromScanResult(result));
}
}
if (!_devicesController.isClosed) {
_devicesController.add(List.unmodifiable(_discoveredDevices));
}
});
await FlutterBluePlus.startScan(
timeout: timeout ?? const Duration(seconds: 10),
withServices: [
Guid(DeviceConstants.omiServiceUuid),
Guid(DeviceConstants.frameServiceUuid),
],
);
} catch (e) {
_isScanning = false;
rethrow;
} finally {
_isScanning = false;
}
}