Firestore web端get()返回文档未缓存,加快照监听器后正常问题咨询
问题结论
该现象完全符合Firestore Web SDK的默认设计预期,不属于代码错误,核心是Web端和移动端的Firestore缓存策略存在差异。
核心机制说明
- Firestore 移动端SDK(Android/iOS)默认开启磁盘持久化,单次
get()请求拉取的文档会自动写入缓存,供后续指定源为缓存的请求读取。但Web端SDK默认关闭磁盘持久化,且未开启持久化时,只有通过snapshots()添加了活跃监听器的文档/集合数据才会被存入临时内存缓存,单次无监听器的get()请求拉取的结果不会被写入任何缓存,因此你首次调用get()拿到数据后,第二次指定从缓存读取就会抛出 unavailable 异常。 - 你添加快照监听器后逻辑正常的原因:监听器注册后,对应文档被纳入SDK的同步范围,此时你主动调用
get()拉取的文档数据会被同步写入内存缓存,第二次指定Source.cache的请求就能正常命中。
解决方案
如果需要让Web端单次get()的结果也能被后续缓存请求命中,只需在所有Firestore操作执行前,手动开启磁盘持久化即可,示例代码如下:
// 初始化Firebase后第一时间调用 await FirebaseFirestore.instance.enablePersistence( PersistenceSettings( synchronizeTabs: true, // 可选,开启多标签页缓存同步 cacheSizeBytes: 80 * 1024 * 1024, // 可选,自定义缓存上限,默认40MB ) );
注意事项
- 开启持久化后如果缓存超出设定的大小上限,SDK会自动清理最近最少使用的缓存数据。
- 持久化仅对当前浏览器环境生效,清除浏览器数据后缓存会被清空。
内容的提问来源于stack exchange,提问作者Marc Van Daele
相关产品推荐
相关产品推荐

