Карта флаттера в конце смены позиции

Я использую flutter_map, чтобы добавить карту в свой проект. Я могу работать с ним и использовать его возможности. Но мне нужно то, чего я не нашел во flutter_map.

Я хочу прослушать изменение позиции и получить последнюю позицию, когда пользователь перестанет касаться экрана. Как onTapUp или onLongPressUp в виджете GestureDetector.

В flutter_map есть опция onPositionChanged, но она вызывается каждый раз при изменении позиции, а это много. Как только пользователь коснулся экрана, вызывается onPositionChanged, пока пользователь не перестанет касаться экрана. Я могу получить последнюю позицию из этого, но я хочу вызвать API, когда позиция изменится, чтобы получить список ближайших автомобилей. Вызов API каждый раз, когда вызывается onPositionChanged, не подходит.

Поэтому я хочу иметь возможность вызывать API, когда пользователь завершает изменение местоположения (когда он / она перестает касаться экрана).

Вот мой код flutter_map:

     FlutterMap(
            key: Key('map'),
            mapController: main.mapController,

            options: MapOptions(
                center: LatLng(main.lat, main.long),
                zoom: 14,
                maxZoom: 18,
                minZoom: 10,
                onPositionChanged: (mapPosition, boolValue){
                  _lastposition = mapPosition.center;
                }),


            layers: [
              TileLayerOptions(
                errorImage: AssetImage('images/login_icon.png'),
                urlTemplate:
                    "https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png",
                // subdomains: ['a', 'b', 'c'],
                // subdomains: ['', '1', '2', '3', '4']
              ),
              MarkerLayerOptions(
                markers: main.markersStart +
                    main.markersDestination +
                    main.driverMarkers,
              ),
            ],
          ),

Любая помощь будет оценена, спасибо:).

3 ответа

Лучшее решение, которое я нашел, - добавить слушателя на MapEventStream(проверьте события здесь: map_events.dart)

        MapController mapController;
  StreamSubscription subscription;

  @override
  void initState() {
    mapController = MapController();

    mapController.onReady.then((_) {
      subscription = mapController.mapEventStream.listen((MapEvent mapEvent) {
        if (mapEvent is MapEventMoveStart) {
          print(DateTime.now().toString() + ' [MapEventMoveStart] START');
          // do something
        }
        if (mapEvent is MapEventMoveEnd) {
          print(DateTime.now().toString() + ' [MapEventMoveStart] END');
          // do something
        }
      });
    });
    super.initState();
  }

  @override
  void dispose() {
    subscription.cancel();
    super.dispose();
  }

Большое спасибо за этот пост, который мне помогает

Самый простой способ, я думаю, это определитьTimerвот так:

      Timer? timer;
....

А потом внутриonPositionChangedсобытие, сначала сбросьте его (фактически сбрасывая старый таймер), затем установите его снова. Используя это,printвызывается только один раз и через 1 секунду после окончания смены позиции

      FlutterMap(
  ...
  options: MapOptions(
    onPositionChanged: (MapPosition position, bool hasGesture) {
      timer?.cancel();

      timer = Timer(Duration(milliseconds: 1000), () {
        print(position);
      });
    }
  ),
  ...
)

Вы можете использовать таймер, который запускается только после задержки в одну секунду.

onPositionChanged: (mapPosition, boolValue) {
              Timer(Duration(seconds: 1), () {}}
Другие вопросы по тегам