【发布时间】:2019-06-02 17:46:11
【问题描述】:
如何为 Google 地图标记 (google_maps_flutter) 的点击事件添加自定义处理程序?我只能看到consumeTapEvents,它实际上并没有接受任何函数,而只是布尔值。我曾想过使用GestureDetector,但似乎不太正确。
在 Google 地图的标记上处理事件的标准方法是什么?我正在尝试点击后导航到新页面。
谢谢
【问题讨论】:
标签: google-maps dart flutter
如何为 Google 地图标记 (google_maps_flutter) 的点击事件添加自定义处理程序?我只能看到consumeTapEvents,它实际上并没有接受任何函数,而只是布尔值。我曾想过使用GestureDetector,但似乎不太正确。
在 Google 地图的标记上处理事件的标准方法是什么?我正在尝试点击后导航到新页面。
谢谢
【问题讨论】:
标签: google-maps dart flutter
随着版本 ^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?
您可以使用地图插件中的 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,
));
});
}
【讨论】:
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); 出于某种原因.. 这不再有效。
请记住,当前版本是 0.0.3 版的开发者预览版。请给它一点时间让事情顺利进行!
【讨论】:
在创建标记时制作自定义对象。
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);
}
【讨论】:
你可以做类似的事情
_mapController.onMarkerTapped.add((marker) {
// your code here
});
其中_mapController 是GoogleMapController 的一个实例:)
【讨论】: