我正在使用Flutter制作使用地图的移动应用程序。我们决定使用Google Map,而我们用于抖动的插件是:
google_maps_flutter:^ 0.5.7
我了解在地图上添加标记的方式如下:
Map<MarkerId, Marker> markers = <MarkerId, Marker>{}; Marker _marker = new Marker( icon: BitmapDescriptor.defaultMarker, markerId: _markerId, position: LatLng(34.024441,-5.0310968), infoWindow: InfoWindow(title: "userMarker", snippet: '*'), ); GoogleMap _map; @override void initState( markers[_markerId] = _marker; _map = new GoogleMap( /* other properties irrelevant to this prob */ markers: Set<Marker>.of(_markers.values), ); );
上面的代码片段确实有效,我可以在地图上看到标记。但是修改标记或尝试添加其他标记(如下面的代码片段一样)不起作用。
FloatingActionButton( onPressed: () { setState(() { _marker = new Marker( icon: BitmapDescriptor.defaultMarker, markerId: _markerId, position: LatLng(currentLocation.latitude, currentLocation.longitude), infoWindow: InfoWindow(title: "userMarker", snippet: '*'), onTap: () { debugPrint("Marker Tapped"); }, ); markers[_markerId] = _marker; // What I do here is modify the only marker in the Map. }); markers.forEach((id,marker) { // This is used to see if the marker properties did change, and they did. debugPrint("MarkerId: $id"); debugPrint("Marker: [${marker.position.latitude},${marker.position.longitude}]"); }); }); )
我的目的是使用另一个插件(geoLocator)来获取用户的位置数据并更改我拥有的唯一标记,以便它可以跟踪他的运动。debugPrint显示数据确实在变化,但是我在地图上看不到变化(测试时,我更改的初始标记使用的位置与我自己的位置不同)。
如果您没有使用Map数据结构的特定原因,这就是我过去所做的事情。
我有一个Set的Marker我State
Set
Marker
State
Set<Marker> markers = Set();
将其提供给地图小部件。标记:标记
GoogleMap( onMapCreated: _onMapCreated, myLocationEnabled: true, initialCameraPosition: CameraPosition(target: LatLng(0.0, 0.0)), markers: markers, )
然后在setState方法中将我正在使用搜索结果构建的,并且将使用用户位置构建的Marker添加到Set of Marker中。
// Create a new marker Marker resultMarker = Marker( markerId: MarkerId(responseResult.name), infoWindow: InfoWindow( title: "${responseResult.name}", snippet: "${responseResult.types?.first}"), position: LatLng(responseResult.geometry.location.lat, responseResult.geometry.location.lng), ); // Add it to Set markers.add(resultMarker);
编辑 :我刚刚注意到您正在使用中的GoogleMap小部件,如果要每次使用新的状态值对其进行重建,则initState需要将其移至该build方法。
initState
build