Android返回键实现Flutter路由出栈传参遇问题求助
解决Android返回键回退时传递数据的问题
核心问题分析
你遇到的!_debugLocked断言错误,是因为在PopScope的onPopInvoked回调里直接调用了Navigator.pop(context)——此时导航器处于锁定状态,重复触发栈操作就会抛出该错误。而NavigatorPopHandler无法触发,大概率是因为Flutter 3.14+版本已用官方的PopScope替代了旧的拦截方案,第三方库不再适配新版本。
正确实现方式
用PopScope拦截系统返回事件,通过Navigator.pop传递数据,注意不要重复触发栈操作:
class SecondPage extends StatelessWidget { const SecondPage({super.key}); @override Widget build(BuildContext context) { return PopScope( onPopInvoked: (didPop) { // didPop为true时,说明导航器已自动处理出栈,无需额外操作 if (didPop) return; // 传递自定义数据给上一页 Navigator.of(context).pop({'state': 'update'}); }, child: Scaffold( appBar: AppBar(title: const Text('第二页')), body: const Center(child: Text('点击返回键测试')), ), ); } }
上一页接收数据的方式
和普通按钮触发的pop逻辑一致,通过await Navigator.push接收返回值:
// 上一页跳转代码 final result = await Navigator.push( context, MaterialPageRoute(builder: (context) => const SecondPage()), ); if (result != null && result is Map) { print('收到返回数据: ${result['state']}'); // 这里处理数据更新逻辑 }
关键注意点
- 必须先判断
didPop状态,避免在导航器锁定时重复调用Navigator.pop。 - Flutter 3.14及以上版本优先使用官方
PopScope,弃用第三方NavigatorPopHandler和旧的WillPopScope。 - 传递的数据需为可序列化类型(如Map、String、int等),避免复杂对象导致序列化异常。
内容的提问来源于stack exchange,提问作者Covex
相关产品推荐
相关产品推荐

