首页 > 解决方案 > 在所有状态下访问 FirebaseUser

问题描述

我想知道在所有应用程序中访问登录用户的最佳做法是什么。并且不要FirebaseAuth.instance.currentUser().then((result) {...});在所有初始化状态下进行。

我有两个想法,创建一个在我启动应用程序时初始化的单例。并听onAuthStateChanged

class GlobalDataAppli {
  static final GlobalDataAppli _appData = new GlobalDataAppli._internal();

  FirebaseUser user;
  IdTokenResult userToken;
  List<Post> myListPost;

  factory GlobalDataAppli() {
    return _appData;
  }

  GlobalDataAppli._internal();
}
final globalData = GlobalDataAppli;

或者我看到了继承的小部件。但这只会共享我的子小部件的用户,而不是在更改视图时。

我还想在整个应用程序中分享帖子列表。事实上,同一篇文章可以在多个页面中看到,所以我想将当前显示的所有文章保存在内存中,以便每个文章小部件都基于相同的变量。因此,对视图上的帖子的修改会反映在显示该帖子的每个视图上。(目前我已将此列表作为每个视图的参数传递,并且它有效,但我知道这不是正确的方法)。

有人知道最好的做法吗?

标签: firebaseflutterfirebase-authentication

解决方案


最常见的选项是:

  1. 使用FirebaseAuth.instance.currentUser(). 虽然您明确表示您不想这样做,但实际上我建议将其作为第一个实现,因为它最有可能为您提供最新的身份验证状态。

  2. Listen for the onAuthStateChangedstream,这可确保您还可以在用户退出时获取信息(例如:如果您在 Firebase 控制台中禁用了他们的帐户)。这比仅仅获得更多的工作currentUser()

  3. 在 中传递当前用户值SharedPreferences。我不太喜欢这种方法,因为它需要我编写 Firebase 已经完成的状态管理代码。

如果您倾向于不使用前两种方法之一,则需要仔细考虑为什么会这样,并验证这些假设。例如:这两种方法都在第一次调用后从本地身份验证状态工作,这意味着性能将与您自己实现的任何替代方法一样好。


推荐阅读