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

Flutter LoginView登录异常处理失效求助:弹窗无法显示

问题分析与修复方案

核心问题是你的登录按钮绑定的是无异常处理的logIn方法,而非你写了异常捕获逻辑的loginCatch方法,导致异常发生时根本不会触发弹窗提示。以下是完整的修复步骤:

1. 替换登录按钮的回调方法

找到登录按钮的GestureDetector,将onTap的回调改为loginCatch:

Padding(
  padding: const EdgeInsets.symmetric(horizontal: 25.0),
  child: GestureDetector(
    // 替换为带异常处理的loginCatch方法
    onTap: loginCatch,
    child: Container(
      padding: EdgeInsets.all(20),
      decoration: BoxDecoration(
        color: Colors.deepPurple,
        borderRadius: BorderRadius.circular(12),
      ),
      child: const Center(
          child: Text(
        'Login',
        style: TextStyle(
          color: Colors.white,
          fontWeight: FontWeight.bold,
          fontSize: 18,
        ),
      )),
    ),
  ),
),

2. 完善异常处理逻辑

当前loginCatch只处理了两种异常,且wrong-password仅打印不弹窗,建议统一弹窗展示,并覆盖更多FirebaseAuth异常场景,同时确保弹窗时组件未销毁:

Future loginCatch() async {
  // 提前校验输入为空的情况
  if (_email.text.trim().isEmpty || _password.text.trim().isEmpty) {
    if (mounted) {
      showDialog(
        context: context,
        builder: (context) {
          return const AlertDialog(
            title: Text('输入错误'),
            content: Text('邮箱和密码不能为空'),
            actions: [
              TextButton(
                onPressed: () => Navigator.pop(context),
                child: Text('确定'),
              ),
            ],
          );
        },
      );
    }
    return;
  }

  try {
    await FirebaseAuth.instance.signInWithEmailAndPassword(
      email: _email.text.trim(),
      password: _password.text.trim(),
    );
    // 登录成功后跳转主页(根据你的路由配置修改)
    if (mounted) {
      Navigator.of(context).pushReplacementNamed(homeRoute);
    }
  } on FirebaseAuthException catch (e) {
    String errorMessage;
    switch (e.code) {
      case 'user-not-found':
        errorMessage = '未找到该用户';
        break;
      case 'wrong-password':
        errorMessage = '密码错误';
        break;
      case 'invalid-email':
        errorMessage = '邮箱格式无效';
        break;
      case 'user-disabled':
        errorMessage = '该用户已被禁用';
        break;
      default:
        errorMessage = '登录失败:${e.message ?? '未知错误'}';
    }
    // 确保组件未销毁再弹窗
    if (mounted) {
      showDialog(
        context: context,
        builder: (context) {
          return AlertDialog(
            title: const Text('登录错误'),
            content: Text(errorMessage),
            actions: [
              TextButton(
                onPressed: () => Navigator.pop(context),
                child: const Text('确定'),
              ),
            ],
          );
        },
      );
    }
  } catch (e) {
    // 捕获其他未知异常
    if (mounted) {
      showDialog(
        context: context,
        builder: (context) {
          return AlertDialog(
            title: const Text('登录错误'),
            content: Text('发生未知错误:$e'),
            actions: [
              TextButton(
                onPressed: () => Navigator.pop(context),
                child: const Text('确定'),
              ),
            ],
          );
        },
      );
    }
  }
}

3. 移除冗余代码

原来的logIn方法已不再使用,可以直接删除,减少代码冗余。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 17:05:59