context_free_router 1.0.3
context_free_router: ^1.0.3 copied to clipboard
No Context Router
README.md #
Context-Free Router — 一款不依赖
BuildContext
的 Flutter 路由插件 零侵入 · 可拦截 · 可监控 · 原生支持多级嵌套导航
✨ 特性 #
- Context-Free 调用
全局单例
ContextFreeRouter.instance
,任何位置都能安全导航 - 多级嵌套导航
同一
Navigator
可容纳多个子栈(典型场景:Tab 内部再 Push) - 可插拔拦截链
登录校验、权限校验、AB 实验等通过实现
RouteInterceptor
即可接入,按priority
顺序执行 - 全局路由监控 监听跳转、取消、重定向、异常等事件,方便统计或埋点
- 灵活的参数与返回值
支持
Map<String, dynamic>
参数、extra
任意对象以及范型化的结果返回 - 自定义转场
通过
NestedRouteTransition
轻松定义子栈专属动画 - 零学习成本 API 与原生 Navigator 类似,易于迁移
📦 安装 #
dependencies:
context_free_router: ^1.0.1
🚀 快速开始 #
1️⃣ 初始化 #
final router = ContextFreeRouter.instance;
MaterialApp(
navigatorKey: router.navigatorKey, // 一定要注入
home: const HomePage(),
);
2️⃣ 注册页面 #
router.register('/', (_) => const HomePage());
router.register('/login', (_) => const LoginPage());
// 嵌套路由:/tab/first, /tab/second…
router.register('/tab', (_) => const TabRootPage());
router.registerNested('/tab', 'first', (_) => const FirstTabPage());
router.registerNested('/tab', 'second', (_) => const SecondTabPage());
3️⃣ 跳转与返回 #
// 普通跳转
router.navigateTo('/login');
// 携带参数
router.navigateTo('/profile', params: {'id': 42});
// 嵌套跳转(先进入父级 /tab,再进入子页)
await router.navigateTo('/tab');
router.navigateToNested('/tab', 'first');
// 返回
if (router.canGoBack()) router.goBack();
4️⃣ 拦截器 #
router.addInterceptor(
AuthInterceptor(
protectedRoutes: ['/profile', '/settings'],
loginRoute: '/login',
isAuthenticatedCallback: () async => AuthService.instance.isLoggedIn,
),
);
router.addInterceptor(
PermissionInterceptor(
routePermissions: {
'/admin': ['can_view_admin'],
},
unauthorizedRoute: '/403',
checkPermissionsCallback: PermissionService.check,
),
);
拦截器越“重要”priority
越高,会先执行。
5️⃣ 监控器 #
router.addMonitor(
AnalyticsMonitor(
trackEvent: (event, props) => Analytics.log(event, props),
),
);
6️⃣ 自定义子栈动画(可选) #
final slide = NestedRouteTransition(
parentPath: '/tab',
childPath: 'first',
transitionBuilder: (ctx, animation, _, child) {
final offset = Tween(begin: const Offset(1, 0), end: Offset.zero)
.animate(animation);
return SlideTransition(position: offset, child: child);
},
);
// 在创建 MaterialPageRoute 之前调用 slide.createRoute(child, settings)
📑 路由执行流程 #
下图展示了从调用
navigateTo / navigateToNested
到最终返回的完整执行链:拦截器 → 嵌套/根导航 → 监听器。
🗂️ API 速查 #
类 / 方法 | 作用 |
---|---|
ContextFreeRouter.instance |
路由单例 |
navigatorKey / currentRoute |
全局 NavigatorKey / 当前路由 |
register / registerNested |
注册根路由 / 子路由 |
navigateTo / navigateToNested |
跳转根路由 / 子路由 |
goBack / canGoBack |
返回 / 是否可返回 |
RouteInterceptor |
自定义拦截器基类 |
RouteMonitor |
路由监控基类 |
AuthInterceptor |
登录拦截示例 |
PermissionInterceptor |
权限拦截示例 |
AnalyticsMonitor |
埋点监控示例 |
RouteConfig |
路由配置对象(包含 path / params / extra 等) |
🛠 示例项目 #
仓库内 example/
目录提供了完整 Demo,涵盖:
- Tab + 嵌套导航
- 登录与权限拦截
- 自定义动画
- 事件埋点
运行:
cd example
flutter run
🤝 贡献指南 #
- Fork 本仓库并创建分支
- 提交 PR 前请运行
flutter test
&dart format .
- 描述清楚问题和解决方案
📄 License #
MIT © 2025 Chihiro