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
相关产品推荐
相关产品推荐

