getPositionStream method

  1. @override
Stream<Position> getPositionStream({
  1. LocationSettings? locationSettings,
})
override

Implementation

@override
Stream<Position> getPositionStream({LocationSettings? locationSettings}) {
  final settings = locationSettings ?? const LocationSettings();
  late StreamController<Position> controller;
  DBusRemoteObject? client;
  StreamSubscription<DBusSignal>? subscription;

  Future<void> start() async {
    client = await _getOrCreateClient();
    final signals = DBusRemoteObjectSignalStream(
      object: client!,
      interface: _clientIface,
      name: 'LocationUpdated',
      signature: DBusSignature('oo'),
    );
    subscription = signals.listen((signal) async {
      try {
        final newPath = signal.values[1] as DBusObjectPath;
        final position = await _readLocation(newPath);
        if (!controller.isClosed) controller.add(position);
      } catch (e, st) {
        if (!controller.isClosed) controller.addError(e, st);
      }
    }, onError: controller.addError);
    await _startClient(
      client!,
      _accuracyToGeoClueLevel(settings.accuracy),
      distanceThreshold: settings.distanceFilter,
    );
  }

  Future<void> stop() async {
    await subscription?.cancel();
    subscription = null;
    if (client != null) {
      await _stopClient(client!);
      client = null;
    }
  }

  controller = StreamController<Position>(
    onListen: () {
      unawaited(
        start().catchError((Object e, StackTrace st) {
          if (!controller.isClosed) controller.addError(e, st);
        }),
      );
    },
    onCancel: stop,
  );

  return controller.stream;
}