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

Flutter go_router:如何手动检查指定路径是否为当前激活路由?

在go_router 7.1.1中检查路由是否激活的方案

针对你遇到的带动态参数和嵌套路由的匹配问题,有几个可靠的方案,都是复用go_router自身的匹配逻辑,不用自己写繁琐易出错的正则:

方案1:给路由命名(最推荐)

在定义路由时给每个路由加上name属性,之后直接通过当前路由的名称判断,简单直观:

// 路由配置示例
final goRouter = GoRouter(
  routes: [
    GoRoute(
      name: 'project', // 给主路由命名
      path: '/projects/:id',
      routes: [
        GoRoute(
          name: 'project-details', // 给详情路由命名
          path: 'details',
        ),
      ],
    ),
  ],
);

在需要判断的地方,获取当前路由状态并对比名称:

final currentRouteName = GoRouterState.of(context).routeName;

bool isProjectActive = currentRouteName == 'project';
bool isDetailsActive = currentRouteName == 'project-details';

方案2:利用matchedRoutes的pathTemplate

go_router的GoRouterState里的matchedRoutes会返回当前匹配到的所有路由层级列表,最后一个元素就是当前最具体的路由。你可以直接对比它的pathTemplate(也就是你定义路由时的原始路径模板):

final state = GoRouterState.of(context);
final currentRoute = state.matchedRoutes.last;

bool isProjectActive = currentRoute.pathTemplate == '/projects/:id';
bool isDetailsActive = currentRoute.pathTemplate == '/projects/:id/details';

这个方法不需要额外给路由命名,直接用原始的路径模板对比就行,完全不会受动态参数值的影响。

方案3:使用matchPath工具函数

go_router内部用来做路径匹配的matchPath函数可以直接调用,通过设置prefix: false实现精确匹配,避免嵌套路由误判:

import 'package:go_router/go_router.dart';

final currentLocation = GoRouterState.of(context).location;

// 检查是否精确匹配项目主路由
bool isProjectActive = matchPath(
  '/projects/:id',
  currentLocation,
  prefix: false,
);

// 检查是否精确匹配详情路由
bool isDetailsActive = matchPath(
  '/projects/:id/details',
  currentLocation,
  prefix: false,
);

如果设置prefix: true,那么详情页路径会被判定匹配主路由模板,所以一定要设为false来做精确匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 17:57:17