startScan method
Future<void>
startScan(
{ - Duration timeout = const Duration(seconds: 10),
})
Implementation
Future<void> startScan({Duration timeout = const Duration(seconds: 10)}) {
if (_lifecycle == _ProbeLifecycle.scanning) {
return _scanFuture!;
}
if (_lifecycle != _ProbeLifecycle.idle) {
return Future<void>.error(_invalidLifecycle('start a scan'));
}
final completer = Completer<void>();
_lifecycle = _ProbeLifecycle.scanning;
_scanCompleter = completer;
_scanFuture = completer.future;
try {
_scanSubscription = _transport
.scan(timeout: timeout)
.listen(
(advertisement) {
if (_scanCompleter != completer ||
_lifecycle == _ProbeLifecycle.disposed) {
return;
}
_devices[advertisement.deviceId] = advertisement;
_record(
ProbeEventKind.scan,
'device discovered rssi=${advertisement.rssi} '
'namePresent=${advertisement.name?.isNotEmpty ?? false}',
);
},
onError: (Object error, StackTrace stackTrace) {
if (_scanCompleter != completer) {
return;
}
unawaited(
_terminateScan(
error: error,
stackTrace: stackTrace,
errorPrefix: 'scan failed',
cancelSubscription: true,
stopTransport: true,
),
);
},
onDone: () {
if (_scanCompleter == completer) {
unawaited(
_terminateScan(
cancelSubscription: false,
stopTransport: false,
),
);
}
},
);
} catch (error, stackTrace) {
unawaited(
_terminateScan(
error: error,
stackTrace: stackTrace,
errorPrefix: 'scan failed',
cancelSubscription: true,
stopTransport: true,
),
);
}
return completer.future;
}