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

Flutter使用Geoflutterfire推送位置重复生成Firestore文档求助

问题原因与解决方案

核心问题

每次调用updateDriverLocation生成新文档,是因为你使用了Firestore的add()方法——这个方法的作用就是在集合中创建新文档并自动生成随机ID,所以每次执行都会新增一条记录。

修复方案

要更新同一文档,需要明确指定文档ID。你已经用当前用户UID作为name字段的值,完全可以把用户UID作为文档ID,确保每次操作指向同一个文档:

修改updateDriverLocation方法:

void updateDriverLocation(){
   Fluttertoast.showToast(msg: "Called");
   geoFlutterFire = Geoflutterfire();
   if(latitude != 0.0 && longitude != 0.0){
      String driverUid = _firebaseAuth.currentUser!.uid; // 获取当前用户UID作为文档ID
      GeoFirePoint geoFirePoint = geoFlutterfire.point(latitude: latitude, longitude: longitude);
      var map = HashMap<String,Object>();
      map['name'] = driverUid;
      map['position'] = geoFirePoint.data;
      // 用doc指定文档ID,set方法会覆盖或合并现有文档(存在则更新,不存在则创建)
      _firebaseFirestore.collection("Drivers").doc(driverUid).set(map, SetOptions(merge: true));
   }
}
  • doc(driverUid)明确指定文档ID,确保每次操作的是同一个文档
  • SetOptions(merge: true)可选:如果文档已存在,只会更新传入的字段(比如仅更新position),不会覆盖文档中其他字段

额外优化建议

在getDrivers方法中,你用DateTime.now().millisecond.toString()作为MarkerId,会导致同一司机每次位置更新都生成新Marker,而非更新旧Marker。建议改用文档ID(司机UID)作为MarkerId:

markers.add(Marker(
   markerId: MarkerId(documentSnapshot.id), // 用文档ID作为唯一标识
   position: LatLng(lat,lon),
   icon: BitmapDescriptor.defaultMarker
));

这样司机位置更新时,会替换旧的Marker,避免地图出现大量重复标记。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 10:30:43