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

Flutter中如何从Navigator移除单个页面(保留前置页面)

Flutter 实现从ScreenC返回直接回到ScreenA(跳过ScreenB)

针对你遇到的场景,有两种简单的解决方式,既能保留ScreenB正常返回ScreenA的逻辑,又能在提交表单跳转到ScreenC后,让ScreenC直接返回ScreenA:

方法一:用pushReplacement替换当前页面(推荐)

这个方法最适配你的需求——提交表单后,用ScreenC替换掉当前的ScreenB,导航栈会从[ScreenA, ScreenB]变成[ScreenA, ScreenC],这样从ScreenC点击返回时就直接回到ScreenA了,完全不影响ScreenB正常返回ScreenA的逻辑。

代码示例(ScreenB的提交按钮事件):

ElevatedButton(
  onPressed: () {
    // 先执行表单提交的业务逻辑
    // ...
    
    // 跳转并替换当前页面
    Navigator.of(context).pushReplacement(
      MaterialPageRoute(builder: (context) => ScreenC()),
    );
  },
  child: const Text('提交进入ScreenC'),
)

方法二:用pushAndRemoveUntil精准控制路由栈

如果之后有更复杂的路由栈需求,可以用这个方法,它能让你自定义保留哪些路由。核心是通过判断条件,只保留ScreenA,移除中间的ScreenB。

步骤1:给ScreenA的路由命名(可选但更清晰)

从ScreenA跳转到ScreenB时,给ScreenA的路由设置名称:

// ScreenA中跳转到ScreenB的代码
Navigator.of(context).push(
  MaterialPageRoute(
    builder: (context) => ScreenB(),
    settings: const RouteSettings(name: 'ScreenA'),
  ),
);

步骤2:跳转时指定保留条件

在ScreenB的提交事件中,使用pushAndRemoveUntil:

Navigator.of(context).pushAndRemoveUntil(
  MaterialPageRoute(builder: (context) => ScreenC()),
  // 条件:路由名称为ScreenA时保留,其他都移除
  (route) => route.settings.name == 'ScreenA',
);

如果不想用命名路由,也可以通过页面类型判断:

Navigator.of(context).pushAndRemoveUntil(
  MaterialPageRoute(builder: (context) => ScreenC()),
  (route) => route is MaterialPageRoute && route.builder(context) is ScreenA,
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 02:37:20