Dart函数仅添加一条Firebase记录至Marker Set,需批量导入符合条件数据
问题分析与解决方案
问题原因
MarkerId重复导致Set去重
你的Marker使用doc['norequest'].toString()作为MarkerId,但如果多个stations记录的norequest值相同,这些Marker会被判定为同一个对象(Set基于对象相等性去重,而Marker的相等性由markerId决定),因此只会保留一条记录。冗余且混乱的遍历逻辑
你通过map遍历文档时,在回调中直接向Set添加Marker,同时强制转换生成List<Map>,这种写法不仅逻辑冗余,还可能干扰遍历执行流程。
修正后的代码
final Set<Marker> _markers = <Marker>{}; // 标记集合 Future<void> markSetss() async { QuerySnapshot querySnapshot = await FirebaseFirestore.instance .collection('stations') .where('norequest', isGreaterThanOrEqualTo: 5) .get(); // 可选:清空原有标记,避免重复添加(根据业务需求决定是否保留) _markers.clear(); // 遍历所有符合条件的文档,创建唯一Marker并添加到Set for (var doc in querySnapshot.docs) { _markers.add( Marker( markerId: MarkerId(doc.id), // 使用Firebase文档唯一ID作为MarkerId position: LatLng(doc['coor'].latitude, doc['coor'].longitude), ), ); } }
修正说明
- 唯一MarkerId:使用Firebase自动生成的文档
doc.id作为MarkerId,确保每个Marker都是唯一的,不会被Set去重,所有符合norequest≥5的记录都会被添加。 - 简化遍历逻辑:直接用
for循环遍历查询结果,去掉冗余的map和集合转换操作,逻辑更清晰高效。 - 可选清空操作:添加
_markers.clear()可以每次调用方法时刷新标记列表,避免重复累积旧标记(如果不需要保留旧标记则启用)。
内容的提问来源于stack exchange,提问作者Afthal Ad
相关产品推荐
相关产品推荐

