Flutter中显示SnackBar时按返回键控制台报错如何修复?
问题原因
报错的核心原因是onWillPop回调执行时,当前页面的context已经进入销毁流程,此时临时通过ScaffoldMessenger.of(context)查找上级节点的操作不安全,元素树状态已经不稳定,无法拿到有效的ScaffoldMessenger实例。
修复方案
你需要在页面状态稳定的生命周期阶段提前保存ScaffoldMessenger的引用,不要在onWillPop回调中临时通过当前页面context查询,具体实现如下:
- 在State类中定义变量存储
ScaffoldMessengerState实例 - 在
didChangeDependencies生命周期中完成实例初始化,这个阶段页面元素树状态稳定,可以安全获取上级节点 - 在
onWillPop回调中直接使用提前存储的实例移除SnackBar
class YourPageState extends State<YourPage> { // 存储ScaffoldMessenger引用 late ScaffoldMessengerState _scaffoldMessenger; @override void didChangeDependencies() { super.didChangeDependencies(); // 页面状态稳定时提前获取引用 _scaffoldMessenger = ScaffoldMessenger.of(context); } @override Widget build(BuildContext context) { return WillPopScope( onWillPop: () async { // 直接调用预存的实例移除SnackBar _scaffoldMessenger.removeCurrentSnackBar(); return true; }, child: Scaffold( // 你的原有页面代码 ), ); } }
内容的提问来源于stack exchange,提问作者Kamlesh
相关产品推荐
相关产品推荐

