如何在邮件被验证时更新Firebase用户流的数据(Flutter)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在邮件被验证时更新Firebase用户流的数据(Flutter)相关的知识,希望对你有一定的参考价值。
我正在用firebase auth构建一个flutter应用,处理用户。我的目标是简化用户的入职体验,允许邮件注册和验证,而不强迫用户签出再签入才能使用全部功能。在对真实用户进行测试之前,这正是我的配置,但绝大多数的反馈都是,这会打断甚至可能导致用户完全放弃验证流程;应用应该简单地检测到这种验证状态的变化,而无需注销。
我已经尝试过什么
我在main.dart中使用了以下内容来提供整个应用程序的auth状态。
StreamProvider < FirebaseUser > .value(
value: FirebaseAuth.instance.onAuthStateChanged,
),
我用 user1 = Provider.of<FirebaseUser>(context, listen: true);
在各个页面中,并通过三元表达式访问不同的属性,比如user1.isEmailVerified,来决定显示给用户的内容。
我知道onAuthStateChanged不会因为邮件验证的变化而被调用,只有用户登录和签出时才会被调用,这一点在接受的答案中解释过。这个问题但我仍然需要更新用户值,以确定用户验证其电子邮件时显示的用户界面。我选择使用一个按钮 "完成电子邮件验证",这将手动触发检查并在验证后用新的值重新加载用户配置文件。这是该按钮的代码。
() async {
// 1
FirebaseUser user =
await _firebaseAuth.currentUser();
print(user.isEmailVerified); // returns false
// 2
await user.getIdToken();
print(user.isEmailVerified);// returns false
// 3
await user.reload();
print(user.isEmailVerified);// returns false
//4
user = await _firebaseAuth.currentUser();
print(user.isEmailVerified);// this finally returns true
}
其中 final _firebaseAuth = FirebaseAuth. instance;
我注意到调用.currentUser()两次(在reload()之前和之后)是唯一的方法来实际返回.isEmailVerified属性的真值,而不需要登出和返回。这是我在 这个GitHub线程.
如果我再按一次按钮,上面所有的打印语句都返回true。
问题
这很好,但问题是存储FirebaseUser流的user1变量即使在这之后也不会改变或更新,所以尽管用户的电子邮件被验证了,UI还是一样。我知道这一点,因为我在代码中放置了以下检查。
print('this one is from the stream:');
print(user1.isEmailVerified);
即使在按钮函数体中,user.isEmailVerified返回true,它仍然返回false。
我试着在按钮中调用set state这样的功能。
setState(() {user1 = user; });
但似乎user1的值仍然保持不变,而且user1.isEmailVerified仍然返回false,即使我试图将它设置为从按钮函数中得到的新值!
这真的很令人沮丧,因为我觉得我已经很接近了,但我就是不知道如何在整个应用程序中刷新user1(firebase用户流)的值,甚至只是在那一个屏幕上。这应该是比较直接的。
我注意到在验证邮件后按热重载,按上面的按钮,在flutter上调试的时候,会自动在整个app中显示更新的.isEmailVerified值。有没有一种方法可以通过编程触发热重载使用的那种重建,也会刷新firebase用户流数据,而不用登出和登录?也许这就是答案所在,但我不知道如何进行。
任何帮助都将是感激的。
FirebaseAuth Flutter插件提供了一个带有onAuthStateChanged的Stream,它对于在用户签入或签出时获得更新很有用,但当用户数据本身发生变化时,它无法提供更新。一个常见的问题是,当我们想检测用户是否刚刚验证了他的电子邮件地址,换句话说就是获取FirebaseUser.isEmailVerified是否改变了它的值,因为这是在服务器端更新的,而不是推送给应用。
FirebaseAuth.currentUser()只会检测用户在本地做出的改变,但如果有任何改变是在服务器端做出的,它是不会检测到的,除非先调用FirebaseUser.reload(),然后我们需要再次调用FirebaseAuth.currentUser()来获取重载的用户,但这个用户还是不会被onAuthStateChanged发出来。
这可以帮助你。https:/pub.devpackagesfirebase_user_stream()
你会发现一个手动解决方案,或者你可以使用软件包。
以上是关于如何在邮件被验证时更新Firebase用户流的数据(Flutter)的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 4 中更新 Firebase 身份验证中的电子邮件地址
如何检查用户是否允许或禁止Facebook身份验证 - Firebase中的电子邮件
如何知道用户电子邮件是不是在 Firebase 控制台中得到验证?