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
相关产品推荐
相关产品推荐

