getPositionStream method

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

Implementation

@override
Stream<Position> getPositionStream({LocationSettings? locationSettings}) {
  final controller = StreamController<Position>.broadcast();
  int? watchId;
  Position? previous;
  final distanceFilter = locationSettings?.distanceFilter ?? 0;

  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(locationSettings?.accuracy),
    timeout: locationSettings?.timeLimit,
    maximumAge: locationSettings is WebSettings
        ? locationSettings.maximumAge
        : null,
  );

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