如何获取当前路由名称?(无Context且用GlobalKey导航场景)
获取当前路由名称(无Context场景)
Great question! Since you're already using a GlobalKey<NavigatorState> to handle navigation without relying on Navigator.of(context), you can reuse that same key to fetch the current route name directly in your interceptor—no context required.
解决方案步骤
Here's how to implement it cleanly:
- 扩展你的
Keys类,添加一个静态方法来获取当前路由名称。这样你可以在任何地方(包括拦截器)直接调用它:
import 'package:flutter/material.dart'; class Keys { static final GlobalKey<NavigatorState> navKey = GlobalKey<NavigatorState>(); // 获取当前路由名称的方法 static String? get currentRouteName { // 方式1:通过NavigatorState的context获取ModalRoute final navigatorContext = navKey.currentState?.context; if (navigatorContext != null) { return ModalRoute.of(navigatorContext)?.settings.name; } // 方式2:直接访问NavigatorState的当前路由(备选方案) final currentRoute = navKey.currentState?.route; return currentRoute?.settings.name; } }
- 在拦截器中使用:
// 示例拦截器逻辑 void yourInterceptorFunction() { final currentRoute = Keys.currentRouteName; if (currentRoute != null) { print("当前显示的路由:$currentRoute"); // 这里添加你的拦截逻辑,比如根据路由做权限校验、日志记录等 } else { print("未获取到有效路由(可能App还未初始化完成)"); } }
关键细节说明
- 空安全处理:一定要用
?.和空判断,因为navKey.currentState可能在App刚启动还未挂载时为null,避免出现空指针异常。 - 路由栈顶层路由:无论是
ModalRoute.of(context)还是navKey.currentState?.route,都会返回当前显示在最顶层的路由名称,也就是用户正在看到的页面路由。 - 两种方式任选:两种获取方式都能正常工作,你可以根据自己的习惯选择其中一种,或者保留两种做 fallback。
内容的提问来源于stack exchange,提问作者Andrii Kovalchuk
相关产品推荐
相关产品推荐

