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

