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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 06:12:10