如何在Flutter登录逻辑中用contains实现邮箱分页面跳转?
实现按邮箱后缀跳转不同页面的方案
方案一:使用contains方法快速实现
直接在登录成功后,通过contains判断邮箱字符串中是否包含指定后缀,再执行对应跳转:
修改你的login函数如下:
void login() async { try { final userCredential = await auth.signInWithEmailAndPassword( email: emailController.text, password: passwordController.text); // 获取当前登录用户的邮箱 final userEmail = userCredential.user?.email ?? emailController.text; // 根据邮箱后缀判断跳转页面 if (userEmail.contains('@gmail.com')) { Navigator.push(context, MaterialPageRoute(builder: (context) => const GmailUserPage())); } else if (userEmail.contains('@hotmail.com')) { Navigator.push(context, MaterialPageRoute(builder: (context) => const HotmailUserPage())); } else { // 默认跳转StudentPage或其他页面 Navigator.push(context, MaterialPageRoute(builder: (context) => const StudentPage())); } } catch (e) { Fluttertoast.showToast( msg: "Tüm alanları doldurunuz.", toastLength: Toast.LENGTH_SHORT, gravity: ToastGravity.BOTTOM, timeInSecForIosWeb: 2, backgroundColor: Colors.red, textColor: Colors.white, fontSize: 16.0); } }
注意:contains方法会匹配字符串中任意位置的子串,比如如果用户邮箱是test@gmail.com.cn,也会被判定为匹配@gmail.com,如果需要严格匹配后缀,建议用下面的方案。
方案二:严格匹配邮箱后缀(更严谨)
通过拆分邮箱字符串获取域名部分,再精确判断:
void login() async { try { final userCredential = await auth.signInWithEmailAndPassword( email: emailController.text, password: passwordController.text); final userEmail = userCredential.user?.email ?? emailController.text; // 拆分邮箱获取域名 final parts = userEmail.split('@'); if (parts.length == 2) { final domain = parts[1]; switch(domain) { case 'gmail.com': Navigator.push(context, MaterialPageRoute(builder: (context) => const GmailUserPage())); break; case 'hotmail.com': Navigator.push(context, MaterialPageRoute(builder: (context) => const HotmailUserPage())); break; default: Navigator.push(context, MaterialPageRoute(builder: (context) => const StudentPage())); break; } } else { // 邮箱格式异常时的默认跳转 Navigator.push(context, MaterialPageRoute(builder: (context) => const StudentPage())); } } catch (e) { Fluttertoast.showToast( msg: "Tüm alanları doldurunuz.", toastLength: Toast.LENGTH_SHORT, gravity: ToastGravity.BOTTOM, timeInSecForIosWeb: 2, backgroundColor: Colors.red, textColor: Colors.white, fontSize: 16.0); } }
额外优化建议
可以把域名和对应页面的映射抽成一个常量Map,方便后续扩展:
final Map<String, Widget Function(BuildContext)> domainPageMap = { 'gmail.com': (context) => const GmailUserPage(), 'hotmail.com': (context) => const HotmailUserPage(), };
然后在判断时直接通过Map取值:
final pageBuilder = domainPageMap[domain] ?? (context) => const StudentPage(); Navigator.push(context, MaterialPageRoute(builder: pageBuilder));
这样新增邮箱后缀时只需修改Map,不用改动判断逻辑。
内容的提问来源于stack exchange,提问作者ckot
相关产品推荐
相关产品推荐

