动态添加标记以扑灭谷歌地图

Ami*_*ine 12 google-maps google-maps-markers flutter

我正在使用 Flutter 制作一个使用地图的移动应用程序。我们决定使用谷歌地图,我们使用的flutter插件是:

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),
  );
);
Run Code Online (Sandbox Code Playgroud)

上面的片段确实有效,我可以看到地图上的标记。但是修改标记或尝试添加另一个标记(如下面的代码段所示)不起作用。

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}]");
      });
    });
)
Run Code Online (Sandbox Code Playgroud)

我的目的是使用另一个插件(geoLocator)来获取用户的位置数据并更改我拥有的唯一标记,以便它可以跟踪他的动作。debugPrint 显示数据确实在更改,但我在地图中看不到任何变化(我更改的初始标记使用的位置与我测试时的位置不同)。

mir*_*cal 16

如果没有特别的理由让你使用 Map 数据结构,这就是我过去所做的。

我有一个SetMarkerState

Set<Marker> markers = Set();
Run Code Online (Sandbox Code Playgroud)

将其交给地图小部件。标记:标记

GoogleMap(
  onMapCreated: _onMapCreated,
  myLocationEnabled: true,
  initialCameraPosition:
    CameraPosition(target: LatLng(0.0, 0.0)),
  markers: markers,
)
Run Code Online (Sandbox Code Playgroud)

然后将我正在使用搜索结果构建的标记添加到 setState 方法中的标记集,您将使用用户的位置构建该标记。

// 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);
Run Code Online (Sandbox Code Playgroud)

编辑:我刚刚注意到你在你的 中使用 GoogleMap 小部件,如果你想每次都用新的状态值重建它initState,你需要将它移动到build方法中。

  • 这是 Flutter、React 和 React Native 中的做法。每次您的状态发生变化时,为了反映 ui 上的变化,框架都会为必要的部分安排一次构建。那些框架正在有效地完成它,您不必担心它。你不会得到一百个谷歌地图小部件和一个缓慢的应用程序。 (7认同)
  • 我正在使用地图,所以我可以跟踪标记 ID。而你的方法正是我正在做的。好像没有更新地图。 (2认同)