startScan method

Future<void> startScan({
  1. 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;
}