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(); } }); }, ), ], ), ); }, ); }, )); } }
额外注意点
- 关闭模态框:我在移除标记前加了
Navigator.pop(context),用户点击删除后模态框会自动关闭,交互更流畅。 - 同步云端数据:既然添加标记时同步了Firestore,删除时也要对应删除文档,确保本地和云端数据一致。
- 废弃方法说明:你之前尝试的
clearMarkers()和removeMarkers()确实已经被官方废弃,现在推荐直接操作_markers集合,再通过setState()更新地图的markers参数,确保你的地图组件是这样绑定的:
GoogleMap( markers: Set<Marker>.of(_markers), // 其他地图配置参数... )
这样修改后,点击移除标记应该就能正常工作啦!
内容的提问来源于stack exchange,提问作者Sery
相关产品推荐
相关产品推荐

