【问题标题】:Flutter google maps: update markers颤振谷歌地图:更新标记
【发布时间】:2019-12-24 12:34:15
【问题描述】:

我正在尝试更新标记的坐标(Google 地图抖动)

我正在像这样“创建”标记。

 Map<MarkerId, Marker> markers = <MarkerId, Marker>{};

Uint8List resizedMarkerImageBytesTemp = await convertUserImage(
        "imgurl");

    MarkerId id = MarkerId(uid);
    Marker _marker = Marker(
      markerId: id,
      onTap: () {
        print("tapped");
      },
      position: LatLng(lat, lng),
      icon: BitmapDescriptor.fromBytes(resizedMarkerImageBytesTemp),
      infoWindow: InfoWindow(title: 'myTitle'),
    );
    setState(() {
      markers[id] = _marker;
    });

更新标记坐标的最佳/最有效方法是什么?

谢谢!

更新:我尝试了以下方法。

MarkerId id = MarkerId(uid); //uid of the marker I want to update

 markers[id].position.longitude = 3.12493;

然后我得到错误:

error: 'longitude' can't be used as a setter because it is final.

【问题讨论】:

  • 你只有一个标记还是一个标记列表?
  • 标记图,比如说 10 个,每个都有一个特定的唯一 ID
  • 当我使用你的方法时,我的GoogleMap(...) 声明中出现错误:无法将参数类型“Map”分配给参数类型“Set” .你能告诉我你是如何声明 GoogleMap() 的吗?将不胜感激(:
  • 我想通了:markers.values.toSet()

标签: google-maps flutter dart


【解决方案1】:

您可以创建一个函数并传递markerId来替换实际的标记:

   updateMarker(id){
 
  final marker = markers.values.toList().firstWhere((item) => item.markerId == id);

  Marker _marker = Marker(
   markerId: marker.markerId,
   onTap: () {
     print("tapped");
   },
   position: LatLng(marker.position.latitude, marker.position.longitude),
   icon: marker.icon,
   infoWindow: InfoWindow(title: 'my new Title'),
  );

 setState(() {
  //the marker is identified by the markerId and not with the index of the list
   markers[id] = _marker;
 });
}

【讨论】:

  • 谢谢,但我的标记实际上是一个地图,所以我得到这个错误:错误:方法'indexOf'没有为类'Map'定义。
  • 我试过这段代码,但是整个应用程序崩溃了: setState(() { markers.keys .where((k) => markers[k].markerId == id) .toList() .forEach(markers.remove); 标记[id] = _marker; }); // 标记“消失”,但添加新标记时,它会崩溃“....
  • 尝试新的更新,您需要用新的标记覆盖标记,因为您无法更新 lat 或 lng 等属性
  • 哥们你是英雄!!!我的工作很棒,它在移动时甚至很平滑!谢谢!!!祝您假期愉快!
【解决方案2】:

您可以在任何想要更改位置的地方轻松使用此代码:

setState((){markers[id]=markers[id].copyWith(positionParam:LatLng(yournewlat,your new long));});

您甚至可以在点击回调的标记中使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-30
    • 1970-01-01
    • 2020-07-19
    • 2012-02-21
    • 1970-01-01
    • 2021-11-03
    • 2021-11-24
    • 2020-01-25
    相关资源
    最近更新 更多