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

Flutter Firestore 2.5.3控制台新增文档字段后无法获取最新数据问题

问题核心诱因
  • Firestore 2.5.3 版本的已知缓存缺陷

该版本的Flutter Firestore SDK存在持久化缓存的结构固化bug:此前已经被缓存到本地的文档,快照结构会被固定,后续在Firebase控制台新增字段后,SDK执行增量同步时,只会更新本地已存在字段的取值,不会主动把新增字段合并到缓存的快照结构中,导致doc.data()返回的Map始终缺少新增的customer_typekey。同时该版本的clearPersistence()方法仅会清理磁盘层面的缓存,不会释放内存中驻留的旧快照,所以仅清空缓存无法解决问题,只有完全卸载重装、或是彻底杀死应用进程重启,才会清空内存缓存加载最新的文档结构。

  • 快照监听逻辑未做缓存过滤

你当前直接监听snapshots()返回的流,Firestore SDK默认的返回逻辑是先返回本地缓存的快照,再返回服务器同步的最新快照,如果同步过程中出现网络波动、或是SDK触发了流的首帧返回,你拿到的就是缺少字段的旧缓存数据,直接解析就会触发强转异常。

  • 模型强转无容错空间

你在Customer.fromMap中直接使用as String对字段做非空强转,只要Map中不存在对应key,取值就为Null,直接触发类型转换异常,没有兼容过渡的空间。

临时修复方案
  • 监听快照时过滤掉来自本地缓存的结果,强制取服务器最新数据:
await for (var customer in customerRef.snapshots()
  .where((doc) => !doc.metadata.isFromCache)
  .map((doc) => doc.data())) {
  yield customer;
}
  • 给字段转换加兜底兼容,避免崩溃:
// 可设置业务侧默认值,或是判断字段不存在时主动拉取服务器数据
type = map['customer_type'] as String? ?? '默认类型';
  • 长期方案建议升级Firestore SDK到3.0.0及以上版本,该缓存合并bug已在后续版本被官方修复。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 15:39:00