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

Flutter对接Firebase实现登录时如何根据用户类型跳转不同首页

解决方案

方法1:直接整合现有校验逻辑

你写的checkBothUserBasesForTheUser函数可以直接接入登录流程,仅需修改signIn方法,在登录成功获取到用户uid后,先调用校验方法判断用户类型,再跳转对应页面即可。

注意:如果你agencies集合的文档ID不是用户Firebase Auth的uid,而是独立的aid字段,需要把校验逻辑改成条件查询,查询agencies集合中uid字段等于当前登录用户uid的文档是否存在。

整合后代码示例

首先保留你原有校验函数:

Future<String> checkBothUserBasesForTheUser(String uid) async {
  DocumentSnapshot _userDoc =
      await FirebaseFirestore.instance.collection('users').doc(uid).get();
  if (_userDoc.exists) return 'users';
  DocumentSnapshot _agencyDoc =
      await FirebaseFirestore.instance.collection('agencies').doc(uid).get();
  if (_agencyDoc.exists)
    return 'agencies';
  else
    return 'null';
}

修改signIn方法如下,这里把嵌套的then改为try catch写法,逻辑更清晰避免回调地狱:

void signIn(String email, String password) async {
  if (_formKey.currentState!.validate()) {
    try {
      // 完成账号密码登录校验
      UserCredential userCredential = await _auth.signInWithEmailAndPassword(
          email: email, password: password);
      String uid = userCredential.user!.uid;
      // 调用方法判断用户所属集合
      String userType = await checkBothUserBasesForTheUser(uid);
      Fluttertoast.showToast(
          timeInSecForIosWeb: 2,
          gravity: ToastGravity.CENTER,
          msg: "登录成功");
      // 按用户类型匹配对应首页
      Widget targetPage;
      if (userType == 'users') {
        targetPage = const UserMainpage(); // 普通用户首页
      } else if (userType == 'agencies') {
        targetPage = const AgencyMainpage(); // 替换为你实际的机构/管理员首页类名
      } else {
        Fluttertoast.showToast(msg: "用户身份异常,请联系管理员处理");
        return;
      }
      // 跳转对应页面
      Navigator.of(context).pushReplacement(
          MaterialPageRoute(builder: (context) => targetPage));
    } catch (e) {
      Fluttertoast.showToast(
        timeInSecForIosWeb: 3,
        gravity: ToastGravity.CENTER,
        msg: "邮箱或密码无效,请检查后重试",
      );
    }
  }
}

其他可选校验方案

  • 使用Firebase Auth自定义声明存储用户类型:适合用户身份不会频繁变更的场景,不需要每次登录都查询Firestore,效率更高。你可以在云函数/后台给注册用户设置role自定义声明,登录后直接调用user.getIdTokenResult()就能拿到身份字段,无需额外查询数据库。
  • 统一用户集合加身份字段:无需拆分两个集合存储不同用户,所有用户都存在同一个users集合中,每个文档新增type字段标记是普通用户还是机构用户,登录后仅需查询一次文档就能拿到身份,比两次集合查询效率更高。

内容的提问来源于stack exchange,提问作者coderhelp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 13:36:08