getPositionStream method

  1. @override
Stream<DevicePosition> getPositionStream({
  1. DeviceLocationSettings? deviceLocationSettings,
})
override

Implementation

@override
Stream<DevicePosition> getPositionStream({
  DeviceLocationSettings? deviceLocationSettings,
}) {
  final controller = StreamController<DevicePosition>.broadcast();
  int? watchId;
  DevicePosition? previous;
  final settings = deviceLocationSettings ?? const DeviceLocationSettings();
  final distanceFilter = settings.distanceFilter;

  void onSuccess(web.GeolocationPosition pos) {
    final next = _positionFromGeoposition(pos);
    if (distanceFilter > 0 && previous != null) {
      final d = distanceBetween(
        previous!.latitude,
        previous!.longitude,
        next.latitude,
        next.longitude,
      );
      if (d < distanceFilter) return;
    }
    previous = next;
    controller.add(next);
  }

  void onError(web.GeolocationPositionError err) {
    controller.addError(_mapError(err));
  }

  final options = _buildOptions(
    enableHighAccuracy: _highAccuracy(settings.accuracy),
    timeout: settings.timeLimit,
    maximumAge: settings is WebSettings ? settings.maximumAge : null,
  );

  controller.onListen = () {
    watchId = _geolocation.watchPosition(
      onSuccess.toJS,
      onError.toJS,
      options,
    );
  };
  controller.onCancel = () {
    if (watchId != null) {
      _geolocation.clearWatch(watchId!);
    }
  };
  return controller.stream;
}