Flutter MVVM架构下FormatException无法在View层捕获的问题求助
Flutter MVVM架构下异步异常捕获失败问题解决
问题现象
采用MVVM架构开发Flutter应用时,尝试在View层捕获ViewModel抛出的FormatException,但程序崩溃,报错信息为:Unhandled Exception: FormatException: Not implemented
核心原因
ViewModel中的getTodos()是异步方法(返回Future<void>),但View层调用时未使用await关键字,导致外层的try/catch无法捕获异步方法内部抛出的异常,异常最终成为未处理的全局异常。
解决方案
将View层中addPostFrameCallback的回调改为异步函数,并在调用getTodos()时添加await,让try/catch能够捕获异步抛出的异常。
修改后的View层代码
@override void initState() { super.initState(); viewModel = Provider.of<TodoViewModel>(context, listen: false); WidgetsBinding.instance.addPostFrameCallback((_) async { // 改为异步回调 try { await viewModel.getTodos(); // 添加await等待异步方法执行完成 } on FormatException catch (e) { DialogMessage.showErrorMessage(context, e.toString()); } }); }
可选优化:ViewModel层代码
ViewModel中捕获异常后重新抛出的操作可以简化,直接让异常自然向上传递即可,无需额外捕获再抛出:
Future<void> getTodos() async { _isLoading = true; notifyListeners(); try { throw const FormatException('Not implemented'); //_todos = await todoRepository.getTodos(); } finally { _isLoading = false; notifyListeners(); } }
内容的提问来源于stack exchange,提问作者Laurent
相关产品推荐
相关产品推荐

