getPositionStream method
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;
}