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
相关产品推荐
相关产品推荐

