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
相关产品推荐
相关产品推荐

