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

Flutter go_router如何移除路由栈中的指定路由?

移除路由栈中的指定页面(当前栈A->B->C->D,在D页移除B)

核心思路是:获取当前完整路由栈,过滤掉目标页面(B)的条目,再将路由栈重置为过滤后的新栈,同时保持当前页面(D)处于栈顶位置。以下是主流路由框架的具体实现方式:

React Navigation(React Native 场景)

适用于 React Navigation 6.x 及以上版本:

import { useNavigation } from '@react-navigation/native';

const DScreen = () => {
  const navigation = useNavigation();

  const removeRouteB = () => {
    // 获取当前路由栈的所有条目
    const currentRoutes = navigation.getState().routes;
    // 过滤掉名称为'B'的路由项(需与B页面注册时的name一致)
    const newRoutes = currentRoutes.filter(route => route.name !== 'B');
    // 重置路由栈,设置当前索引为D页面在新栈中的位置
    navigation.reset({
      index: newRoutes.findIndex(route => route.name === 'D'),
      routes: newRoutes,
    });
  };

  return (
    // 示例:点击按钮触发移除操作
    <Button title="移除路由B" onPress={removeRouteB} />
  );
};

执行后路由栈变为 A -> C -> D,从D页面返回将直接回到C,再返回回到A,完全跳过B。

Vue Router(Vue 3 + Vue Router 4 场景)

import { useRouter } from 'vue-router';

const DPage = {
  setup() {
    const router = useRouter();

    const removeRouteB = () => {
      // 获取当前history栈的条目数组
      const currentEntries = router.options.history.state.entries;
      // 过滤掉名称为'B'的路由记录(需与B路由配置的name一致)
      const newEntries = currentEntries.filter(entry => entry.name !== 'B');
      // 替换history状态,更新栈内容与当前索引
      router.options.history.replaceState({
        ...router.options.history.state,
        entries: newEntries,
        index: newEntries.length - 1
      });
      // 同步路由视图更新
      router.replace(router.currentRoute.value.fullPath);
    };

    return { removeRouteB };
  },
  template: `<button @click="removeRouteB">移除路由B</button>`
};

React Router(Web 场景,React Router 6.x 及以上)

import { useNavigate, useLocation } from 'react-router-dom';

const DPage = () => {
  const navigate = useNavigate();
  const location = useLocation();

  const removeRouteB = () => {
    // 从浏览器history中获取当前栈条目
    const historyEntries = window.history.state?.entries || [];
    // 过滤掉B页面对应的路径(假设B页面路径为'/b')
    const newEntries = historyEntries.filter(entry => entry.pathname !== '/b');
    // 替换浏览器history状态
    window.history.replaceState({
      ...window.history.state,
      entries: newEntries,
      index: newEntries.length - 1
    }, '', location.pathname);
    // 触发路由重渲染,同步视图
    navigate(0);
  };

  return <button onClick={removeRouteB}>移除路由B</button>;
};

内容的提问来源于stack exchange,提问作者Zhuoyuan.Li

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 22:05:03