Firestore内存缓存触发时机及单例式会话数据最佳实践咨询
问题1:单例式会话数据的最佳实践
有几种成熟方案可以实现类似Firebase Auth的单例式会话数据管理:
- 自定义单例类:创建
UserSession单例类,登录后一次性拉取user记录并存入内存,后续所有组件直接访问该单例的属性。示例代码:
class UserSession { static final UserSession _instance = UserSession._internal(); User? currentUser; factory UserSession() => _instance; UserSession._internal(); // 初始化用户数据 Future<void> initUser(String authUserId) async { final doc = await FirebaseFirestore.instance.collection('user').doc(authUserId).get(); currentUser = User.fromDoc(doc); // 假设User是自定义模型类 } }
登录完成后调用await UserSession().initUser(authUserId),之后在任意位置通过UserSession().currentUser获取缓存的用户数据。
- 依赖注入工具:用
GetIt这类DI工具将用户实例注册为单例,适合复杂项目解耦和测试。示例:
// 初始化时注册单例 GetIt.I.registerSingletonAsync<User>(() async { final authUserId = FirebaseAuth.instance.currentUser!.uid; final doc = await FirebaseFirestore.instance.collection('user').doc(authUserId).get(); return User.fromDoc(doc); }); // 任意位置获取用户实例 final user = await GetIt.I.getAsync<User>();
问题2:Firestore本地缓存的命中规则
Firestore的get()方法默认行为是优先返回本地缓存数据,同时后台联网同步最新版本,具体规则如下:
针对你描述的场景:
- 第一次调用
get()时,若本地无缓存,直接联网请求,获取后将数据存入内存和磁盘缓存(默认开启)。 - 第二次调用同文档的
get()时,会先返回缓存中的数据,同时后台联网检查更新(若有新数据则更新缓存)。
如果需要精确控制来源,可以通过GetOptions指定:
- 强制仅走网络:
get(GetOptions(source: Source.server)) - 强制仅用缓存:
get(GetOptions(source: Source.cache))
注意:内存缓存仅在应用生命周期内有效,重启后清空;磁盘缓存会持久化,下次启动可直接读取。实时监听doc.snapshots()会自动维护缓存最新状态,而get()默认是"读缓存+后台同步"模式。
内容的提问来源于stack exchange,提问作者cmjordan
相关产品推荐
相关产品推荐

