Flutter中如何判断Firebase Firestore文档是否已提交至云端?
判断Firestore离线提交的文档是否同步到云端
Firestore离线时会把写入操作缓存到本地,所以你能在查询结果里看到这些文档,但要判断它们是否成功同步到云端,主要靠文档的元数据来识别:
1. 直接检查文档快照的元数据
当你通过add()方法写入文档时,会返回一个DocumentReference对象,你可以用它获取文档快照,然后检查快照元数据里的hasPendingWrites属性:
- 如果
hasPendingWrites为true,说明文档还在本地缓存,未同步到云端 - 如果为
false,说明已经成功提交到云端
示例代码:
// 提交文档时获取DocumentReference final docRef = await FirebaseFirestore.instance .collection('col1') .doc("ID1") .collection("col2") .add({ 'info1': info1, 'info2': info2, 'info3': info2, 'info4': [info1,info1], 'CreateAt': FieldValue.serverTimestamp(), // 建议加上服务器时间戳,确保排序准确 }); // 获取快照并检查同步状态 final snapshot = await docRef.get(); if (snapshot.metadata.hasPendingWrites) { print("文档还在本地缓存,未同步到云端"); } else { print("文档已成功提交到云端"); }
2. 实时监听文档的同步状态变化
如果需要实时跟踪文档的同步状态,可以监听文档快照的变化,每次元数据更新时都会触发回调:
docRef.snapshots().listen((snapshot) { if (snapshot.metadata.hasPendingWrites) { // 未同步状态 print("文档待同步"); } else { // 已同步状态 print("文档已同步到云端"); } });
3. 在查询结果中逐个判断文档状态
对于你用orderBy("CreateAt")获取的查询快照,遍历每个文档时同样可以检查其元数据:
FirebaseFirestore.instance .collection('col1') .doc("ID1") .collection("col2") .orderBy("CreateAt", descending: true) .snapshots() .listen((querySnapshot) { for (var doc in querySnapshot.docs) { final isSynced = !doc.metadata.hasPendingWrites; print("文档${doc.id}是否已同步到云端:$isSynced"); } });
需要注意的是:hasPendingWrites只会标识当前文档是否有未完成的写入操作,当设备重新联网后,Firestore会自动重试同步,一旦成功,这个属性就会变为false。
内容的提问来源于stack exchange,提问作者ismail
相关产品推荐
相关产品推荐

