Flutter/Dart 为 Google Maps Marker 添加自定义点击事件

Posted

技术标签:

【中文标题】Flutter/Dart 为 Google Maps Marker 添加自定义点击事件【英文标题】:Flutter/Dart Add custom Tap Events for Google Maps Marker 【发布时间】:2019-06-02 17:46:11 【问题描述】:

如何为 Google 地图标记 (google_maps_flutter) 的点击事件添加自定义处理程序?我只能看到consumeTapEvents,它实际上并没有接受任何函数,而只是布尔值。我曾想过使用GestureDetector,但似乎不太正确。

在 Google 地图的标记上处理事件的标准方法是什么?我正在尝试点击后导航到新页面。

谢谢

【问题讨论】:

【参考方案1】:

随着版本 ^0.3.0+1 的发布,引入了新的标记 API,它将标记作为小部件处理(包括 onTap() 方法)。这样,谷歌地图就有一个markers: 选项,它允许一个标记对象列表。每个元素都可以这样定义:

Marker(
  markerId: MarkerId("id"), // a string for marker unique id
  icon: BitmapDescriptor.defaultMarker(), // options for hues and custom imgs
  position: LatLng(lat, long), // lat and long doubles

  onTap: () 
    //this is what you're looking for!
  

),

比以前的控制器方法容易得多!

【讨论】:

我们是否可以访问此VoidCallback 上标记的position @mahmoud_eslami 在这种特殊情况下,您正在设置标记(如从数据中获取并在地图上设置),因此您知道位置并设置了它。你指的是什么情况?就像点击地图并获取坐标一样?【参考方案2】:

您可以使用地图插件中的 onTap 或 onLongPress 选项来监控点击事件。然后你可以通过以下方式在点击的位置添加标记

    final Set<Marker> _markers = ;



 GoogleMap(onMapCreated: _onMapCreated,
        initialCameraPosition: CameraPosition(
          target: _center,
          zoom: 13.0,
        ),
        compassEnabled: true,
        tiltGesturesEnabled: false,
        onTap: (latlang)
          if(_markers.length>=1)
            
              _markers.clear();
            

          _onAddMarkerButtonPressed(latlang);
        ,
        myLocationEnabled: true,
        myLocationButtonEnabled: true,
        mapType: mapType,
        markers: _markers,
        onCameraMove: _onCameraMove,
      ),

_onAddMarkerButtonPressed 函数在哪里

 void _onAddMarkerButtonPressed(LatLng latlang) 
loadAddress(latlang);
_latLng = latlang;
 setState(() 
  _markers.add(Marker(
    // This marker id can be anything that uniquely identifies each marker.
    markerId: MarkerId(_lastMapPosition.toString()),
    position: latlang,
    infoWindow: InfoWindow(
      title: address,
    //  snippet: '5 Star Rating',
    ),
    icon: BitmapDescriptor.defaultMarker,
  ));
);

【讨论】:

【参考方案3】:
     void _onMapCreated(GoogleMapController controller)
    this._controller = controller;
    controller.onMarkerTapped.add(_onMarkerTapped);


void _onMarkerTapped(Marker marker) 
...


Widget build(BuildContext context) 
 ... GoogleMap(
        onMapCreated: _onMapCreated,
        options: GoogleMapOptions(
          ...
        ));

【讨论】:

controller.onMarkerTapped.add(_onMarkerTapped); 出于某种原因.. 这不再有效。【参考方案4】:

请记住,当前版本是 0.0.3 版的开发者预览版。请给它一点时间让事情顺利进行!

【讨论】:

所有商品 :) 所以答案是:还没有。对吗? 如果 API 页面上没有列出,那么它还不存在。【参考方案5】:

在创建标记时制作自定义对象。

var map = <String, String> ; // custom object

for (int i = 0; i < mCrag.length; i++) 
    controller.addMarker(new MarkerOptions(
       icon: BitmapDescriptor.fromAsset('assets/images/down-arrow.png'),
       position: LatLng(double.parse(mCrag[i].lat), double.parse(mCrag[i].lon)),
    )).then((marker) 
         map[marker.id] = mCrag[i].id; // this will return when tap on marker
         return marker;
    );


// marker click event
void onMarkerTapped(Marker marker) 
   var selectedMarker = map[marker.id];  // here you will get your id.
   debugPrint(selectedMarker);
   getRoutes(selectedMarker);

【讨论】:

【参考方案6】:

你可以做类似的事情

_mapController.onMarkerTapped.add((marker) 
      // your code here
    );

其中_mapControllerGoogleMapController 的一个实例:)

【讨论】:

如何在此代码中添加方法..我想选择位置并获取该位置的纬度、经度

以上是关于Flutter/Dart 为 Google Maps Marker 添加自定义点击事件的主要内容,如果未能解决你的问题,请参考以下文章

flutter Dart语言List如何获取索引值

flutter - dart基础之map

如何在 Flutter Dart 中迭代 JSON Map 并检索键值结果?

Flutter/Dart JSON 和现有库类的序列化

如何正确覆盖一个类,以便在 Flutter [Dart] 中唯一地添加到地图中

Flutter基础组件08BottomNavigationBar