如何在飞镖/颤振中设置或删除地图标记

Posted

技术标签:

【中文标题】如何在飞镖/颤振中设置或删除地图标记【英文标题】:How to set or remove map markers in dart/flutter 【发布时间】:2021-10-23 11:01:39 【问题描述】:

我正在尝试根据用户在 Firebase 中的“活动”状态在地图小部件上放置和删除标记:

Map <MarkerId, Marker> markers = <MarkerId, Marker>;
.
.
.
markerStream.listen((List<DocumentSnapshot> documentList) 

  documentList.forEach((DocumentSnapshot document) 

    bool activeField = (document.data() as dynamic)['active'];   
    final GeoPoint point = (document
        .data() as dynamic)['position']['geopoint'];
    final uid = (document.data() as dynamic)['uid'].toString();

    //if field 'active' in firebase is set to true or false

    activeField == true ? _addMarker(point.latitude, point.longitude, uid) 
    :  _removeMarker(uid);
   );

删除方法:

_removeMarker( String uid) 
    
// checks uid is in markers.values map, if there, remove from collection , if not, 
//I need a way to put continue or ignore in the `orElse` parameter instead of null, because the markerId cannot be null:

    Marker? _markers = markers.values.firstWhere(
              (thisMarker) => thisMarker.markerId.value == uid ,
              orElse: () => null);

    setState(() 
      markers.remove(_marker);
    );
      

当我省略 orElse 参数时,此代码运行。如果 firebase 中的所有条目在运行时都设置为 true,则会出现标记,并且在切换为 false 时会消失。问题是当条目在运行之前已经处于“假”状态时,会导致错误元素错误,因为它仍未存储在集合中。或者从 true 切换回 false 不会从地图小部件中删除标记。

【问题讨论】:

【参考方案1】:

我安装并导入了package:collection 使用.firstWHereOrNull 并添加.markerIdin 作为键(我忘记了)

Marker? _marker = markers.values.firstWhereOrNull(
            (Marker thisMarker) => thisMarker.markerId.value == uid );
    
    markers.remove(_marker!.markerId);
    setState(() 

    );

  

【讨论】:

以上是关于如何在飞镖/颤振中设置或删除地图标记的主要内容,如果未能解决你的问题,请参考以下文章

用户如何在谷歌地图颤振上添加多个标记

如何在颤振中使用 json API 在谷歌地图中添加标记?

居中所有标记和折线谷歌地图插件颤振适合屏幕

如何在返回小部件之前遍历列表以创建地图?颤振 - 飞镖

如何从谷歌地图中删除特定的多个标记而不是单个或所有标记

如何在 Flutter 中自定义谷歌地图标记图标