You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 19:06:00