我需要在每个屏幕上获取currentUser吗?

时间:2019-12-15 23:55:32

标签: flutter firebase-authentication

目前,我在每个屏幕上都获得了currentUser,如下所示:

FirebaseUser user = await FirebaseAuth.instance.currentUser();

是否有办法只执行一次并将数据保存为某种形式的全局变量,可以在所有屏幕上进行访问。在Django中,我们有会话对象。颤动中是否有等效的东西?不确定在每个屏幕上获取currentuser是否是一种不稳定的操作方式。如果是这样,我将创建一个异步函数并在每个屏幕上调用它。 我对FirebaseStorageFirestore做同样的事情。

谢谢

2 个答案:

答案 0 :(得分:1)

无需进行任何API调用即可更改用户的身份验证状态,例如,每小时更新ID令牌或在Firebase控制台中禁用帐户时。

由于这个原因,您几乎应该始终将用户对象视为瞬态对象,然后在每个屏幕上重新检索它。

如果用户仍然有效,则该调用实际上是纯客户端,并立即返回(但仍异步)。在大多数本机Firebase SDK中,在某些情况下,您会调用FirebaseAuth.getInstance().getCurrentUser()(Android)之类的同步方法,但Flutter绑定的作者对此表示反对,这可能是因为Dart的await关键字很方便。 / p>

答案 1 :(得分:0)

弗兰克的答案是正确的。

我认为基本问题是这是异步调用,每个屏幕都将被FutureBuilder所吸引,这让我非常不舒服

所以这是一种避免它的方法。一些难看的代码:

static FirebaseUser currentUser = null;
FirebaseAuth.instance.onAuthStateChanged.listen((FirebaseUser user) => currentUser = user);

请记住要检查是否为null,因为用户可能会自己注销或被外部踢出。