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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 19:27:31