You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于角色的Flutter登录系统导航失效问题求助

问题分析与修复方案

你的核心问题是:登录成功后没有从Firestore读取用户角色,也未触发预设的角色导航逻辑。当前代码里的signUserIn方法仅完成了登录验证和关闭加载弹窗的操作,完全没调用你写好的navigateBasedOnRole函数,自然无法实现角色跳转。

修复步骤

  1. 确保已定义Role枚举(如果未定义,补充以下代码):
enum Role { admin, user }
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 06:22:42