【发布时间】:2020-07-01 00:05:20
【问题描述】:
1。问题
我正在使用 try-catch-finally1 动态来处理我的应用程序的简单身份验证包中的 Firebase 异常处理。在其中,当我收到来自 Firebase 身份验证服务的错误时,我会更新(自定义)TextFormField 上的 labelText,以向用户显示发生了错误。
但是,notifyListeners() 显然是与 catch 子句同时运行的,导致重建不会与异常处理同步发生。
目前,我基本上都在使用ChangeNotifierProvider,但我应该更改为FutureProvider 动态。如果是这样,最好的方法是什么?
1 我也尝试过使用then-catchError-whenComplete。
2。守则
2.1 完整代码(可选)
目前项目中的完整代码有点长,但我认为下面显示的内容就足够了。
无论如何,如果您想检查所有内容,可以使用整个项目:flutter_firebase_auth_benchmark。
相关文件有:
-
firebase_auth.dart:带有相关数据的provider类。 -
login_screen.dart:email_field通过Consumer小部件提供provider数据。 -
password_reset_workflow.dart:调用相关方法的按钮通过AnimatedSwitcher放入LoginScreen。
2.2 提供者类
我不得不使用Future.delayed 来手动同步notifyListeners() 和build() 方法——我知道,我知道,这很糟糕......
class Auth extends ChangeNotifier {
String _errorMsg;
String get errorMsg => _errorMsg;
...
Future<void> sendPasswordResetWithEmail({@required String email}) async {
try {
await FirebaseAuth.instance.sendPasswordResetEmail(email: email);
} catch(e) {
switch (e.code) {
case 'ERROR_USER_NOT_FOUND':
_errorMsg = 'user not found';
break;
default:
throw UnknownPasswordResetError(
'Unknown error for password reset with Firebase.');
}
} finally {
notifyListeners();
await Future.delayed(Duration(milliseconds: 10));
}
}
}
2.3 我的自定义TextFormField 小部件
应用中有这样的东西:
return Consumer<Auth>(
builder: (context, auth, _) {
return AuthTextFormField(
...,
errorMsgFromServer: auth.errorMsg,
);
}
);
最后,验证按钮在if 子句中使用formKey.currentState.validate() 异步触发await auth.sendPasswordResetWithEmail。
【问题讨论】:
-
到目前为止,我最接近回答这个问题的是this SO answer。
标签: firebase flutter exception dart flutter-provider