当前位置: 首页 > news >正文

Flutter GoRouter 路由导航详解

Flutter GoRouter 路由导航详解

一、GoRouter 概述

GoRouter 是 Flutter 官方推荐的路由管理库,提供声明式路由配置和类型安全的导航。

1.1 安装依赖

dependencies: go_router: ^12.0.0

二、基本配置

2.1 创建路由配置

import 'package:go_router/go_router.dart'; final GoRouter router = GoRouter( routes: <RouteBase>[ GoRoute( path: '/', builder: (BuildContext context, GoRouterState state) { return const HomePage(); }, ), GoRoute( path: '/details/:id', builder: (BuildContext context, GoRouterState state) { return DetailPage(id: state.pathParameters['id']!); }, ), ], );

2.2 配置 MaterialApp

class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp.router( routerConfig: router, title: 'GoRouter Demo', ); } }

三、路由导航

3.1 基本导航

// 导航到指定路径 context.push('/details/123'); // 导航并替换当前页面 context.pushReplacement('/details/123'); // 返回上一页 context.pop(); // 返回到根页面 context.popUntil((route) => route.isFirst);

3.2 带参数导航

// 路径参数 context.push('/user/${user.id}'); // 查询参数 context.push('/search?q=flutter'); // 额外参数 context.push('/details', extra: {'data': myData});

四、路由守卫

4.1 全局守卫

final GoRouter router = GoRouter( routes: [...], redirect: (BuildContext context, GoRouterState state) { final bool isLoggedIn = // 检查登录状态 if (!isLoggedIn && state.location != '/login') { return '/login'; } return null; }, );

4.2 路由级别守卫

GoRoute( path: '/profile', builder: (context, state) => const ProfilePage(), redirect: (context, state) { final bool isLoggedIn = // 检查登录状态 return isLoggedIn ? null : '/login'; }, );

五、嵌套路由

5.1 配置嵌套路由

GoRoute( path: '/dashboard', builder: (context, state) => const DashboardPage(), routes: [ GoRoute( path: 'settings', builder: (context, state) => const SettingsPage(), ), GoRoute( path: 'profile', builder: (context, state) => const ProfilePage(), ), ], );

5.2 使用 ShellRoute

final GoRouter router = GoRouter( routes: [ ShellRoute( builder: (context, state, child) { return Scaffold( body: child, bottomNavigationBar: BottomNavigationBar( items: const [ BottomNavigationBarItem(icon: Icon(Icons.home), label: 'Home'), BottomNavigationBarItem(icon: Icon(Icons.settings), label: 'Settings'), ], ), ); }, routes: [ GoRoute( path: '/', builder: (context, state) => const HomePage(), ), GoRoute( path: '/settings', builder: (context, state) => const SettingsPage(), ), ], ), ], );

六、类型安全路由

6.1 使用 TypedGoRoute

@TypedGoRoute<HomeRoute>(path: '/') class HomeRoute extends GoRouteData { const HomeRoute(); @override Widget build(BuildContext context, GoRouterState state) { return const HomePage(); } } @TypedGoRoute<DetailRoute>(path: '/details/:id') class DetailRoute extends GoRouteData { const DetailRoute({required this.id}); final String id; @override Widget build(BuildContext context, GoRouterState state) { return DetailPage(id: id); } }

6.2 类型安全导航

// 使用类型安全导航 HomeRoute().go(context); DetailRoute(id: '123').push(context);

七、实战案例

7.1 完整路由配置

final GoRouter router = GoRouter( initialLocation: '/', routes: [ GoRoute( path: '/', name: 'home', builder: (context, state) => const HomePage(), ), GoRoute( path: '/login', name: 'login', builder: (context, state) => const LoginPage(), ), GoRoute( path: '/dashboard', name: 'dashboard', builder: (context, state) => const DashboardPage(), redirect: (context, state) { final authState = Provider.of<AuthState>(context, listen: false); return authState.isLoggedIn ? null : '/login'; }, routes: [ GoRoute( path: 'profile', name: 'profile', builder: (context, state) => const ProfilePage(), ), GoRoute( path: 'settings', name: 'settings', builder: (context, state) => const SettingsPage(), ), ], ), ], errorBuilder: (context, state) => const ErrorPage(), );

7.2 使用路由信息

class DetailPage extends StatelessWidget { const DetailPage({super.key}); @override Widget build(BuildContext context) { final GoRouterState state = GoRouterState.of(context); final String id = state.pathParameters['id']!; final String? query = state.uri.queryParameters['q']; return Scaffold( appBar: AppBar(title: const Text('详情')), body: Center( child: Column( children: [ Text('ID: $id'), if (query != null) Text('查询: $query'), ], ), ), ); } }

八、总结

GoRouter 提供了强大的路由管理功能:

  1. 声明式配置- 集中配置所有路由
  2. 类型安全- TypedGoRoute 确保类型安全
  3. 路由守卫- 全局和路由级别守卫
  4. 嵌套路由- 支持复杂的页面结构
  5. ShellRoute- 共享布局的路由

合理使用可以构建清晰的导航结构。

http://www.jsqmd.com/news/912967/

相关文章:

  • 网盘直链解析终极指南:一键解锁高速下载体验
  • 3个核心功能彻底解决Windows C盘爆红问题:开源工具Windows Cleaner深度解析
  • 如何快速解锁QQ音乐加密文件:qmcdump音频解密工具终极指南
  • 微信视频号直播数据抓取终极指南:5分钟搭建专业级监控系统
  • 2026年横评10款降AI率工具:一键锁定高效助手! - 降AI小能手
  • 论文开题报告怎么写呀?
  • 179、运动控制中的行业标准:机器人安全标准ISO 10218
  • Prompt Engineering 深度解析:从 Few-shot 到结构化提示的系统化方法
  • 基于STM32的多功能万年历电子闹钟设计与实现
  • 告别PuTTY!Win10/Server 2019自带的OpenSSH客户端,这样用才顺手
  • 2025-2026年全球留香沐浴露品牌推荐:十大口碑产品评测约会前提升魅力价格注意事项 - 品牌推荐
  • 从“事后Debug”到“事前防御”:聊聊C#代码契约(Code Contracts)与Assert断言的配合使用
  • 【Agent智能体10 | 反思设计模式-AI数据分析的可视化实战】
  • 【单射频链束训练】对具有1个射频链的OFDM-MIMO系统进行束扫描研究附Matlab代码
  • 忘记压缩包密码怎么办?3步教你用专业工具快速找回
  • 别再死磕Vivado了!用VSCode写ZYNQ代码,效率翻倍的保姆级配置指南
  • CentOS 7.6下Mellanox网卡驱动升级避坑指南:从依赖安装到模块冲突解决
  • 植物大数据平台技术解析与品牌选型参考指南:新疆本地做智慧农业、数字农业的公司/新疆棉花智慧农业企业有哪些?/新疆棉花种植用的植物监测传感器企业/选择指南 - 优质品牌商家
  • 专业级AVIF图像插件:Photoshop高效图像压缩完整解决方案
  • ROS2跨机通信真就这么简单?用DDS和ROS_DOMAIN_ID轻松隔离你的机器人网络
  • WarcraftHelper魔兽争霸III优化工具:5分钟解锁游戏全部潜力,告别老旧限制
  • 多 Agent 对证循环协作架构:Hermes + Claude Code + Codex 三角色工作流实战
  • 房地产咨询 Agent:房源匹配 Harness
  • 你的Zotero文献语言设置对了吗?GB/T 7714样式下,让英文文献正确显示‘et al.’的完整配置流程
  • AI 模型推理服务部署深度解析:从 Triton 到 vLLM 的生产级推理架构
  • Arm CCI-550/CCI-500地址通道带宽异常分析与优化
  • 如何选留香沐浴露品牌?2026年5月推荐TOP10对比香气持久案例适用场景 - 品牌推荐
  • 成都及四川EPS泡沫板服务机构排行:南充市,广安市,雅安市,檐口线条、石膏装饰线条、自建房外墙线条、EPS浮雕线条选择指南 - 优质品牌商家
  • 这6个动作让python selenium爬虫规避检测
  • 【Claude NPV分析权威指南】:20年财务AI专家首曝大模型估值新范式,3步精准测算项目真实价值