Dart调用异步login方法时出现AuthExceptionController实例报错的原因
错误原因
login()是异步方法,但你声明的返回值为void,异步方法内部抛出的异常会被封装为Future的错误信息,返回void时调用方无法获取对应的Future实例,自然无法监听处理异常。- 页面层调用
login()方法时没有添加await关键字,同步的try-catch只能捕获同步执行上下文内抛出的异常,异步任务未等待就执行完毕的话,后续抛出的异常不会被当前try块捕获,会成为全局未处理异常。
修复方案
步骤1:修改controller层login方法的返回类型
将返回值从void改为Future<void>,让调用方可以获取到异步任务对应的Future实例:
// controller Future<void> login(BuildContext context) async { isLoading.value = Status.loading; try { UserModel? user = await repository.signInWithEmailAndPassword( emailTextController.text, passwordTextController.text); if (user != null) { box.write("auth", user); QR.navigator.replaceAll('/initial'); } } on AuthException catch (error) { throw AuthExceptionController(title: error.title, content: error.content); } finally { isLoading.value = Status.success; } }
步骤2:修改页面层调用逻辑
有两种可选的异常捕获方式:
方式1:搭配async/await使用try-catch(更推荐,可读性更高)
// page onPressed: () async { if (_formKey.currentState!.validate()) { try { // 添加await等待异步方法执行完成 await _authenticationController.login(context); } on AuthExceptionController catch (error) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text(error.content))); } } }
方式2:直接调用Future的catchError方法
如果不想将onPressed改为异步方法,可以直接对返回的Future注册异常回调:
// page onPressed: () { if (_formKey.currentState!.validate()) { _authenticationController.login(context) .catchError((error) { if (error is AuthExceptionController) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text(error.content))); } }); } }
内容的提问来源于stack exchange,提问作者Igor Gomes
相关产品推荐
相关产品推荐

