基于角色的Flutter登录系统导航失效问题求助
问题分析与修复方案
你的核心问题是:登录成功后没有从Firestore读取用户角色,也未触发预设的角色导航逻辑。当前代码里的signUserIn方法仅完成了登录验证和关闭加载弹窗的操作,完全没调用你写好的navigateBasedOnRole函数,自然无法实现角色跳转。
修复步骤
- 确保已定义
Role枚举(如果未定义,补充以下代码):
enum Role { admin, user }
- 修改
signUserIn方法,在登录成功后从Firestore获取用户角色并执行导航:
void signUserIn() async { // 显示加载弹窗 showDialog( context: context, builder: (context) => const Center(child: CircularProgressIndicator()), ); try { // 1. 完成Firebase邮箱密码登录 UserCredential userCredential = await FirebaseAuth.instance.signInWithEmailAndPassword( email: emailController.text, password: passwordController.text, ); User? user = userCredential.user; if (user != null) { // 2. 从Firestore查询用户角色数据(需和注册时的集合/字段名一致) DocumentSnapshot userDoc = await FirebaseFirestore.instance .collection('users') .doc(user.uid) .get(); if (userDoc.exists) { // 3. 解析角色字段(假设注册时存储的是字符串格式的角色值) String roleStr = userDoc['role']; Role userRole = roleStr == 'admin' ? Role.admin : Role.user; // 4. 关闭加载弹窗并执行角色导航 Navigator.pop(context); navigateBasedOnRole(context, userRole); } else { // 用户文档不存在的异常处理 Navigator.pop(context); showDialog( context: context, builder: (context) => const AlertDialog(title: Text('用户数据不存在')), ); } } } on FirebaseAuthException catch (e) { Navigator.pop(context); // 原有登录错误提示逻辑 if (e.code == 'user-not-found') { wrongEmailMessage(); } else if (e.code == 'wrong-password') { wrongPasswordMessage(); } } catch (e) { // 处理Firestore查询等其他异常 Navigator.pop(context); showDialog( context: context, builder: (context) => AlertDialog(title: Text('登录失败: ${e.toString()}')), ); } }
关键注意点
- 必须保证Firestore的集合名(示例中为
users)、角色字段名(示例中为role)和你注册页面的存储逻辑完全匹配,否则会出现角色查询失败 - 如果注册时存储的是枚举索引值,解析逻辑需调整为
Role.values[userDoc['role']] - 新增的异常处理逻辑可避免因用户数据缺失导致的崩溃
内容的提问来源于stack exchange,提问作者orange708
相关产品推荐
相关产品推荐

