【发布时间】:2021-04-03 14:22:04
【问题描述】:
我正在使用 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});
}
【问题讨论】:
标签: firebase flutter google-cloud-firestore provider