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

使用FirebaseAuth登录时无法捕获异常致应用崩溃的问题

解决Firebase Authentication登录异常捕获与自定义提示问题

你的代码已经具备基础的try-catch结构,但缺少将错误信息反馈给用户的逻辑,且未覆盖所有可能的异常类型。以下是修复后的完整代码:

import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';

class LoginScreen extends StatelessWidget {
  final TextEditingController emailController = TextEditingController();
  final TextEditingController passwordController = TextEditingController();

  Future<void> signInWithEmailAndPassword(BuildContext context) async {
    try {
      await FirebaseAuth.instance.signInWithEmailAndPassword(
        email: emailController.text.trim(),
        password: passwordController.text.trim(),
      );
      // 登录成功后的逻辑,比如跳转到主页
      // Navigator.pushReplacement(context, MaterialPageRoute(builder: (_) => HomeScreen()));
    } on FirebaseAuthException catch (e) {
      String errorMessage;
      // 根据Firebase错误码返回用户友好的提示
      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 (context.mounted) {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text(errorMessage)),
        );
      }
    } catch (e) {
      // 捕获其他未预料的异常,避免应用崩溃
      if (context.mounted) {
        ScaffoldMessenger.of(context).showSnackBar(
          const SnackBar(content: Text('发生未知错误,请稍后重试')),
        );
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Inicio de Sesión')),
      body: Padding(
        padding: const EdgeInsets.all(20.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: [
            TextFormField(
              controller: emailController,
              decoration: const InputDecoration(labelText: 'Correo Electrónico'),
              validator: (value) {
                if (value == null || value.isEmpty || !value.contains('@')) {
                  return 'Por favor, ingresa un correo electrónico válido';
                }
                return null;
              },
            ),
            const SizedBox(height: 20.0),
            TextFormField(
              controller: passwordController,
              decoration: const InputDecoration(labelText: 'Contraseña'),
              obscureText: true,
              validator: (value) {
                if (value == null || value.isEmpty) {
                  return 'Por favor, ingresa tu contraseña';
                }
                return null;
              },
            ),
            const SizedBox(height: 20.0),
            ElevatedButton(
              onPressed: () {
                if (emailController.text.trim().isEmpty || 
                    passwordController.text.trim().isEmpty) {
                  ScaffoldMessenger.of(context).showSnackBar(
                    const SnackBar(content: Text('Por favor, completa todos los campos')),
                  );
                } else {
                  signInWithEmailAndPassword(context);
                }
              },
              child: const Text('Iniciar Sesión'),
            ),
          ],
        ),
      ),
    );
  }
}

关键修改说明:

  • 自定义错误提示:通过switch匹配Firebase官方错误码,返回用户易懂的中文提示,避免直接展示技术化错误信息
  • 错误反馈给用户:使用ScaffoldMessenger弹出SnackBar,确保用户能直观看到登录失败的原因
  • 覆盖全异常类型:新增通用catch (e)块,捕获所有非FirebaseAuthException的异常,彻底避免应用崩溃
  • 输入内容优化:调用trim()去除邮箱、密码的前后空格,防止用户误输入空格导致的验证失败
  • 安全使用Context:添加context.mounted判断,确保在Widget仍处于挂载状态时调用UI操作,避免内存泄漏或报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 10:46:14