Flutter try catch访问err.errormessage提示getter未定义报错
报错信息
类型'Object'上未定义getter 'errormessage'。请尝试导入定义了'errormessage'的库、将名称修正为现有getter的正确名称,或定义名为'errormessage'的getter或字段。
问题根因
这个报错是多个问题叠加导致的:
- 你用
catch (err)捕获异常时没有指定具体异常类型,Dart会默认把err推断为最顶层的Object类型,Object类根本没有errormessage这个属性,静态类型检查阶段就会直接报错。 - Firebase Auth抛出的认证异常为
FirebaseAuthException类型,存储错误提示文本的属性叫message,你写的errormessage是错误的属性名,根本不存在。 - 额外说明:你原有代码把
signInWithEmailAndPassword的返回值直接强转成User也是错的,这个方法返回的是UserCredential对象,要取它的.user属性才是登录后的用户实例,就算异常问题修复,这里也会触发类型转换错误。
修复方案
- 用
on FirebaseAuthException catch精准捕获认证类异常,同时加通用catch兜底处理其他意外错误 - 用正确的
message属性读取错误文本,加空值兜底避免空指针异常 - 把已经废弃的
FlatButton替换为新版Flutter推荐的TextButton,避免编译警告 - 修正用户实例的获取逻辑,从返回的
UserCredential里取.user属性
修复后的完整代码:
try { UserCredential userCred = await auth.signInWithEmailAndPassword( email: _email, password: _password ); User? user = userCred.user; // 登录成功后的业务逻辑写在这里 } on FirebaseAuthException catch (err) { showError(err.message ?? '登录失败,请稍后重试'); } catch (err) { showError(err.toString()); } void showError(String errMsg) { showDialog( context: context, builder: (BuildContext context) { return AlertDialog( title: const Text('Error'), content: Text(errMsg), actions: <Widget>[ TextButton( onPressed: () => Navigator.of(context).pop(), child: const Text('Ok') ) ], ); } ); }
内容的提问来源于stack exchange,提问作者Aliyan shahid satti
相关产品推荐
相关产品推荐

