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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 03:33:28