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

问题描述 投票:3回答:5

如何为Google Maps Marker(google_maps_flutter)的点击事件添加自定义处理程序?我只能看到consumeTapEvents实际上没有任何功能,只有bool。我曾经想过使用GestureDetector,但似乎不太正确。

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

谢谢

google-maps dart flutter
5个回答
6
投票

随着版本^ 0.3.0 + 1的发布,引入了一个新的Marker 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!
  }

),

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


2
投票
     void _onMapCreated(GoogleMapController controller){
    this._controller = controller;
    controller.onMarkerTapped.add(_onMarkerTapped);
}

void _onMarkerTapped(Marker marker) {
...
}

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

1
投票

请记住,当前版本是版本0.0.3的开发人员预览版。请给它一点时间让事情奏效,拜托!


1
投票

创建标记时创建自定义对象。

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);
}

0
投票

你可以做点什么

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

其中_mapControllerGoogleMapController的一个例子:)


0
投票

您可以使用地图插件中的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,
  ));
});
}
© www.soinside.com 2019 - 2024. All rights reserved.