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

Flutter路由pop后API请求完成需展示SnackBar报错如何解决?

异常根因

该报错本质是执行Navigator.pop(context)后,当前路由对应的组件已被从组件树移除,对应context已经失效。异步请求完成回调中再通过失效的context查找ScaffoldMessenger时,就会触发组件树状态不稳定的报错。

解决方案

核心思路是在context失效前,提前获取ScaffoldMessenger的全局实例引用,后续直接用该实例展示SnackBar,不需要再依赖已经销毁的页面context,修改后代码如下:

ElevatedButton(
  onPressed: () async {
    final snackBar = SnackBar(
      behavior: SnackBarBehavior.fixed,
      duration: Duration(seconds: 2),
      content: Text('Done'),
    );
    // 提前获取ScaffoldMessenger实例,不要在异步回调中再用context获取
    final messenger = ScaffoldMessenger.of(context);
    apiCall().whenComplete(() => messenger.showSnackBar(snackBar));
    Navigator.pop(context);
  },
  child: Text('Fetch data'),
),
补充说明
  • ScaffoldMessenger是挂载在MaterialApp全局层级的实例,只要应用还在前台运行,提前获取的实例就不会失效,就算当前路由销毁后调用showSnackBar,也会在当前显示的页面底部正常弹出提示。
  • 如果需要处理请求时间过长、应用已经退到后台的场景,可以额外添加请求取消逻辑,避免不必要的资源消耗。

内容的提问来源于stack exchange,提问作者justchris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 11:15:04