1

我正在使用 flutter_map 将地图添加到我的项目中。我能够使用它并使用它的选项。但是我想要一些我在flutter_map中找不到的东西。

当用户停止触摸屏幕时,我想听位置变化并获得最后一个位置。就像 GestureDetector 小部件中的 onTapUp 或 onLongPressUp 一样。

flutter_map 中有 onPositionChanged 选项,但每次位置发生变化时都会调用它,这很多。一旦用户触摸屏幕,onPositionChanged 就会被调用,直到用户停止触摸屏幕。我可以从中获得最后一个位置,但我想在位置发生变化时调用 API 以获取附近汽车的列表。每次调用 onPositionChanged 时调用 API 都不好。

所以我希望能够在用户完成更改位置时(当他/她停止触摸屏幕时)调用 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,
              ),
            ],
          ),

任何帮助将不胜感激,谢谢:)。

4

2 回答 2

2

我发现的最佳解决方案是添加一个监听器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();
  }

非常感谢这篇对我有帮助的帖子

于 2021-09-22T16:55:08.643 回答
-1

您可以使用计时器,它仅在延迟一秒后执行。

onPositionChanged: (mapPosition, boolValue) {
              Timer(Duration(seconds: 1), () {}}
于 2020-07-04T15:09:07.703 回答