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

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()方法默认行为是优先返回本地缓存数据,同时后台联网同步最新版本,具体规则如下:

针对你描述的场景:

  1. 第一次调用get()时,若本地无缓存,直接联网请求,获取后将数据存入内存和磁盘缓存(默认开启)。
  2. 第二次调用同文档的get()时,会先返回缓存中的数据,同时后台联网检查更新(若有新数据则更新缓存)。

如果需要精确控制来源,可以通过GetOptions指定:

  • 强制仅走网络:get(GetOptions(source: Source.server))
  • 强制仅用缓存:get(GetOptions(source: Source.cache))

注意:内存缓存仅在应用生命周期内有效,重启后清空;磁盘缓存会持久化,下次启动可直接读取。实时监听doc.snapshots()会自动维护缓存最新状态,而get()默认是"读缓存+后台同步"模式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 03:10:55