我在使用 Flutter 开发的移动应用中添加了 Firebase Auth 服务的登录功能。但是,当用户登录后打开应用时,有时会被引导到登录页面而不是主页,因为该currentUser
字段可能返回 null。
我在网上搜索了一下,发现authStateChanges
可以用。这让我有点担心,因为我觉得它会占用太多网络流量。
使用该reload
方法能解决我遇到的问题吗?
这是我的代码,目前运行不正确:
final currentUser = FirebaseAuth.instance.currentUser; // sometimes return null
if (currentUser == null) {
_navigateToLogin();
} else {
_navigateToHome();
}
解决方案的建议代码:
FirebaseAuth.instance.authStateChanges().listen((User? user) {
if (user == null) {
_navigateToLogin();
} else {
_navigateToHome();
}
});
我想要做的事情:
var user = FirebaseAuth.instance.currentUser;
await user?.reload();
user = FirebaseAuth.instance.currentUser;
if (user == null) {
await _navigateToLogin();
} else {
await _navigateToHome();
}
我尝试了一下我想要的代码,没有发现任何错误,但我担心是否会再次遇到类似的问题。所以我想问一下。
user.reload()
不能替代authStateChanges
。authStateChanges
不会“过度使用互联网”。它只是响应已经发生的用户身份验证状态变化,除了您希望在状态更改时运行的代码外,不会导致任何新的工作。您共享的代码正是您想要的。因此,如果您想在检查时检查用户是否已经过身份验证,那么以下代码可以正确完成此工作:
这也是一种常见的做法,根据身份验证状态将用户重定向到代表屏幕。
另一方面,
authStateChanges
用于在用户使用应用时监听身份验证变化。因此,它是一个保持连接的监听器。请注意,这种连接不需要“太多的互联网连接”。所以不用担心。此外,请记住,User#realod()在您的场景中没有帮助,因为如果已登录,它会刷新当前用户。因此,例如,如果您单击了邮件中收到的用于电子邮件验证的链接,那么调用是有意义的
reload()
,但这不是您的情况。