Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google maps 动态添加标记到Flatter google地图_Google Maps_Flutter_Google Maps Markers - Fatal编程技术网

Google maps 动态添加标记到Flatter google地图

Google maps 动态添加标记到Flatter google地图,google-maps,flutter,google-maps-markers,Google Maps,Flutter,Google Maps Markers,我正在使用flatter制作一个使用地图的移动应用程序。我们决定使用谷歌地图,我们使用的Flitter插件是: 谷歌地图颤振:^0.5.7 我知道向地图添加标记的工作方式如下: Map<MarkerId, Marker> markers = <MarkerId, Marker>{}; Marker _marker = new Marker( icon: BitmapDescriptor.defaultMarker, markerId: _markerId, p

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

谷歌地图颤振:^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),
  );
);

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

如果您没有使用地图数据结构的具体原因,下面是我过去所做的

我的
状态中有一组
标记

Set<Marker> markers = Set();
然后在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);

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

您在第一个代码段中没有_标记,但您在(_markers.values)行上使用,这让我觉得你的问题可能与namingI只是错误地复制了错误的名字有关。实际上,我正在将markers对象传递给我的自定义map类构造函数,该构造函数中包含_markers属性。这可能是一个参考问题吗?因为我将标记传递给构造函数,而我不知道Dart是如何引用对象的,所以我使用地图来跟踪标记ID。你的方法正是我正在做的。它似乎没有更新地图。是的,因为谷歌地图处于您的初始状态,而不是在构建方法上。每次状态改变时,有状态的小部件都会调用它们的构建方法,而不是initState方法。没错,将其移动到构建方法是可行的。但据我所知,我只需要一个GoogleMap实例,这就是为什么我把它放在initState中,将它移动到build方法意味着每个构建都将创建一个新实例。有更好的方法吗?这是在颤振、反应和自然反应中的方法。每当您的状态发生变化时,为了反映ui上的变化,框架会为必要的部分安排构建。这些框架正在有效地完成这项工作,您不必担心。你不会有上百个谷歌地图小部件和一个缓慢的应用程序。
GoogleMap(
  onMapCreated: _onMapCreated,
  myLocationEnabled: true,
  initialCameraPosition:
    CameraPosition(target: LatLng(0.0, 0.0)),
  markers: markers,
)
// 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);