FlutterLogin结合Firebase时,如何在catchError返回FutureOr<Null>?
解决FlutterLogin回调中Firebase认证错误返回的类型问题
我在将Firebase认证接入FlutterLogin的_authUser回调时遇到类型错误,代码如下:
Future<String?> _authUser(BuildContext context, LoginData data) { debugPrint('Name: ${data.name}, Password: ${data.password}'); return auth .signInWithEmailAndPassword(email: data.name, password: data.password) .then((credential) { return null; }).catchError((e) { if (e.code == 'weak-password') { debugPrint('The password provided is too weak.'); return Future.error(e); } else if (e.code == 'email-already-in-use') { return 'The account already exists for that email.'; } else { debugPrint(e.toString()); // 触发异常时执行此处 return Future.error(e); } }); }
当用户不存在触发user-not-found异常时,返回错误时出现类型错误提示:
A value of type 'Future' can't be returned by the 'onError' handler because it must be assignable to 'FutureOr
'
现在需要解决如何正确返回错误给FlutterLogin,满足FutureOr<String?>的类型要求。
问题出在catchError回调中返回了Future.error(e),这不符合FutureOr<String?>的类型要求——catchError的返回值需要是String?或者Future<String?>,而Future.error(e)的类型是Future<Never>,无法匹配。
正确的处理方式有两种:
方式1:直接返回错误消息字符串
针对Firebase认证的不同错误码,返回对应的用户友好提示字符串,成功时返回null:
Future<String?> _authUser(BuildContext context, LoginData data) { debugPrint('Name: ${data.name}, Password: ${data.password}'); return auth .signInWithEmailAndPassword(email: data.name, password: data.password) .then((credential) { return null; }).catchError((e) { debugPrint(e.toString()); switch(e.code) { case 'weak-password': return '密码强度不足,请设置更强的密码'; case 'email-already-in-use': return '该邮箱已注册过账户'; case 'user-not-found': return '未找到该邮箱对应的用户'; case 'wrong-password': return '密码错误,请重试'; default: return '登录失败,请稍后重试'; } }); }
方式2:直接抛出异常
如果希望通过异常传递错误,可以在catchError中直接throw异常,而不是返回Future.error(e),这样整个Future会进入错误状态,FlutterLogin会自动捕获并处理:
Future<String?> _authUser(BuildContext context, LoginData data) { debugPrint('Name: ${data.name}, Password: ${data.password}'); return auth .signInWithEmailAndPassword(email: data.name, password: data.password) .then((credential) { return null; }).catchError((e) { debugPrint(e.toString()); // 根据错误码自定义异常消息,或直接抛出原异常 String errorMessage; switch(e.code) { case 'weak-password': errorMessage = '密码强度不足,请设置更强的密码'; break; case 'email-already-in-use': errorMessage = '该邮箱已注册过账户'; break; case 'user-not-found': errorMessage = '未找到该邮箱对应的用户'; break; case 'wrong-password': errorMessage = '密码错误,请重试'; break; default: errorMessage = '登录失败,请稍后重试'; } throw errorMessage; }); }
注意:两种方式都能满足FutureOr<String?>的类型要求,方式1更直接返回错误文本,方式2通过异常传递,FlutterLogin都会将错误信息展示给用户。
内容的提问来源于stack exchange,提问作者Stéphane de Luca
相关产品推荐
相关产品推荐

