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

