【发布时间】:2020-05-08 16:17:31
【问题描述】:
我正在构建一个带有 Firebase 身份验证的颤振应用程序来处理用户。我的目标是通过允许电子邮件注册和验证来简化用户入职体验,而无需强制用户退出并再次登录以使用全部功能。在与真实用户进行测试之前,这正是我所配置的,但压倒性的反馈是它会中断,甚至可能导致用户完全放弃身份验证流程;应用程序应该只检测验证状态的这种变化,而无需注销。
我的尝试
我在 main.dart 中使用以下内容在整个应用程序中提供身份验证状态:
StreamProvider < FirebaseUser > .value(
value: FirebaseAuth.instance.onAuthStateChanged,
),
我用
user1 = Provider.of<FirebaseUser>(context, listen: true);
在各个页面中访问不同的属性,如三元表达式中的 user1.isEmailVerified 以确定向用户显示的内容。
我知道 onAuthStateChanged 不会被调用以更改电子邮件验证,仅用于用户登录和注销,如this question 的接受答案中所述,但我仍然需要更新确定 UI 的用户值当用户验证他们的电子邮件时显示。我选择使用“完成电子邮件验证”按钮,一旦验证,它将手动触发用户配置文件的检查和重新加载新值。这是那个按钮的代码:
() 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
}
最终 _firebaseAuth = FirebaseAuth.instance;
我注意到调用 .currentUser() 两次(在 reload() 之前和之后)是真正为 .isEmailVerified 属性返回 true 而无需注销并重新登录的唯一方法。这是我在 @ 中找到的答案987654322@。
如果我再次按下按钮,上面的所有打印语句都会返回 true。
问题
这很好,但问题是存储 FirebaseUser 流的 user1 变量即使在此之后也不会更改或更新,因此尽管用户电子邮件经过验证,用户界面仍然保持不变。我知道这一点是因为我在代码中进行了以下检查:
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 用户流)的值。这应该更直接。
我注意到在验证电子邮件后按下热重载并按下上面的按钮将在整个应用程序中自动显示更新的 .isEmailVerified 值,同时在颤振上进行调试。有没有办法以编程方式触发热重载使用的相同类型的重建,这也将刷新 firebase 用户流数据,而无需注销并重新登录?也许这就是答案所在,但我不知道如何继续。
任何帮助将不胜感激。
【问题讨论】:
标签: firebase flutter firebase-authentication