You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter:如何通过模态框移除Google Maps标记?现有方法失效求助

解决Google Maps标记移除时的"Bad state: No element"错误

嘿,我一眼就看出问题出在哪了——你在移除标记时的匹配条件写错啦!

错误根源

你用marker.markerId.value == point来查找要删除的标记,但markerId.value是你创建标记时用point.toString()生成的字符串,而point是LatLng对象,字符串和对象直接比较永远不会相等,这就导致firstWhere找不到对应的元素,直接抛出了"Bad state: No element"异常。

修正方案

我给你调整了代码,修复匹配逻辑,同时加上必要的UI更新和健壮性处理:

_handleTap(LatLng point) async {
  if (_markers.isEmpty) {
    FirebaseUser users = await FirebaseAuth.instance.currentUser();
    await Firestore.instance
        .collection("markers")
        .document(users.uid)
        .setData({
      "coordinates": point.toString(),
    });
  }
  setState(() {
    _markers.add(Marker(
      markerId: MarkerId(point.toString()),
      position: point,
      onTap: () {
        showModalBottomSheet<void>(
          context: context,
          builder: (BuildContext context) {
            return Container(
              child: Wrap(
                children: <Widget>[
                  ListTile(
                    leading: Icon(Icons.delete),
                    title: Text('Remove marker'),
                    onTap: () async {
                      // 先关闭模态框,提升用户体验
                      Navigator.pop(context);
                      setState(() {
                        // 正确匹配markerId的字符串值
                        final targetMarker = _markers.firstWhere(
                          (marker) => marker.markerId.value == point.toString(),
                          // 增加orElse参数,避免找不到元素时崩溃
                          orElse: () => null,
                        );
                        if (targetMarker != null) {
                          _markers.remove(targetMarker);
                          // 同步删除Firestore中的对应记录,保持数据一致性
                          FirebaseUser users = await FirebaseAuth.instance.currentUser();
                          await Firestore.instance
                              .collection("markers")
                              .document(users.uid)
                              .delete();
                        }
                      });
                    },
                  ),
                ],
              ),
            );
          },
        );
      },
    ));
  }
}

额外注意点

  1. 关闭模态框:我在移除标记前加了Navigator.pop(context),用户点击删除后模态框会自动关闭,交互更流畅。
  2. 同步云端数据:既然添加标记时同步了Firestore,删除时也要对应删除文档,确保本地和云端数据一致。
  3. 废弃方法说明:你之前尝试的clearMarkers()和removeMarkers()确实已经被官方废弃,现在推荐直接操作_markers集合,再通过setState()更新地图的markers参数,确保你的地图组件是这样绑定的:
GoogleMap(
  markers: Set<Marker>.of(_markers),
  // 其他地图配置参数...
)

这样修改后,点击移除标记应该就能正常工作啦!

内容的提问来源于stack exchange,提问作者Sery

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:51:58