Flutter登录报错调用Navigator.pop关闭Dialog出现黑屏如何解决
问题根因
- 代码同时混用了
try-catch和Future.catchError两套异常捕获逻辑,触发错误时会重复执行Navigator.pop(context):- 登录请求报错后首先进入
catchError回调,第一次执行pop关闭加载对话框 - 回调执行完成后代码继续向下执行,此时
firebaseUser为null,进入else分支第二次执行pop,直接把登录页从路由栈中移除,路由栈为空就出现黑屏
- 登录请求报错后首先进入
- 跳转到注册页时使用了
pushNamedAndRemoveUntil搭配(route) => false参数,会清空之前的路由栈,也可能导致返回时栈空黑屏
修复方案
第一步:删除冗余的Future.catchError,统一用try-catch处理异常
修改后的loginAutentcatUser方法代码如下:
void loginAutentcatUser(BuildContext context) async { try { showDialog( context: context, barrierDismissible: false, // 禁止用户手动关闭加载对话框 builder: (BuildContext context) { return ProgressDialog(message: 'Authenticating Please wait',); } ); // 移除catchError,异常统一交给外层try-catch处理 final firebaseUser = (await _firebaseAuth.signInWithEmailAndPassword( email: emailController.text, password: passwordController.text )).user; if (firebaseUser != null) { userRef.child(firebaseUser.uid).once().then( (DataSnapshot snap) { // 先关闭加载对话框 Navigator.pop(context); if (snap.value != null) { Navigator.pushNamedAndRemoveUntil( context, MainScreen.idScreen, (route) => false ); displayToastMessage('登录成功', context); } else { _firebaseAuth.signOut(); displayToastMessage('用户不存在,请创建新账号', context); } }, ); } else{ Navigator.pop(context); displayToastMessage('发生未知错误', context); } } on PlatformException catch (err) { Navigator.pop(context); displayToastMessage('错误:02 ${err.toString()}', context); } catch (err) { Navigator.pop(context); displayToastMessage('错误:03 ${err.toString()}', context); } }
第二步:修改注册页跳转逻辑
跳转到注册页不要清空路由栈,把pushNamedAndRemoveUntil替换为普通的pushNamed:
// 替换原有跳转逻辑 Navigator.pushNamed(context, RegistrationScrren.idScreen);
效果说明
修改后所有错误场景只会执行一次pop关闭加载对话框,不会误删登录/注册页,报错后会停留在当前页面,用户可以重新输入账号密码提交。
内容的提问来源于stack exchange,提问作者Md. Fazle Rabbi
相关产品推荐
相关产品推荐

