如何在邮件被验证时更新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()

你会发现一个手动解决方案,或者你可以使用软件包。

给TA打赏
共{{data.count}}人
人已打赏
解决方案

在实体框架查询中包含多个

2022-4-22 7:00:08

解决方案

Sequelize hasMany工作正常,但反比关系不正常

2022-4-22 7:00:11

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索