firebase - 提供者从流中获取价值的延迟
问题描述
我正在使用flutter和firebase构建一个基于多角色的身份验证应用程序。我正在使用提供程序来检索用户,uid
以防用户登录或返回null
。由于我必须为每个用户集成多个角色,所以我实现了这个类,它从当前用户文档的 firestore 中获取角色字段数据,并根据角色返回屏幕。它做得很好,我知道它无处不在,但它一直运行良好。
class RoleCheck extends StatefulWidget {
@override
_RoleCheckState createState() => _RoleCheckState();
}
class _RoleCheckState extends State<RoleCheck> {
String role;
@override
Widget build(BuildContext context) {
final user = Provider.of<UserModel>(context);
if (user != null) {
FirebaseFirestore.instance
.collection('users')
.doc(user.uid)
.get()
.then((docs) {
if (docs.exists && docs.data().isNotEmpty) {
setState(() {
role = docs.data()['Role'];
});
}
});
if (role == 'student') {
return StudentNavigationScreen();
} else if (role == 'teacher') {
return TeacherNavigationScreen();
} else if (role == 'admin') {
return AdminNavigationScreen();
} else if (role == 'parent') {
return ParentNavigationScreen();
}
}
return Body();
}
}
一个问题是,即使用户已登录,并且我关闭并打开应用程序,它也会显示登录和注册屏幕,即Body()
几秒钟,然后显示当前用户的主屏幕。我想防止每次用户关闭应用程序时显示此 Body,并且我想改进或外部化该Role checking
功能。
这是我的直播
Stream<UserModel> get user {
return _auth.authStateChanges().map(_userFromFirebaseUser);
}
UserModel _userFromFirebaseUser(User user) {
return user != null ? UserModel(uid: user.uid) : null;
}
这是 UserModel 类
class UserModel {
final String uid;
UserModel({this.uid});
}
解决方案
authStateChanges()
不会立即给你一个用户对象。SDK 需要一些时间来加载和验证用户令牌,然后才能为之前登录的用户提供用户对象。如果你想改进,你将不得不编写一些代码来显示等待屏幕或类似的东西加载用户令牌时的用户体验。
推荐阅读
- python - 无需线程即可同时运行 Kivy 和 DeepSpeech
- sql - 可以在 Entity Framework Core 中动态加入相关模型吗?
- asp.net - 带有剃须刀的引导轮播问题
- javascript - 当“元素不可交互”时如何使用 Selenium 将“值”设置为输入
- oracle19c - 有没有办法转置两个字符串并得到一个表格作为结果?
- java - 方法 insert(String, Pair
>) 对于 BSTMap 类型不明确 >> 错误 - qt - 如何在 qml 中将半径应用于 ApplicationWindow
- c# - 使用 Twilio 发送 Apple 静默推送通知
- swift - 扩展中符合protocl,如何初始化属性?
- python - 我什么时候应该考虑使用预训练模型 word2vec 模型权重?