路由
同 html 一样,在 flutter app 中也存在页面之间跳转需求,flutter自然也是支持! 一共支持两种,Navigator 与 go_router!
WidgetsApp 虽也支持路由,但功能比 Material&CupertinoApp 少很多,它没提供像 MaterialPageRoute 这样现成路由管理方式。
下例中我们会使用 MaterialPageRoute(WidgetsApp可以直接使用它,因为它是独立的功能,它并没有强依赖于 MaterialApp) 甚至直接 Material/CupertinoApp来学习路由,熟练之后 我们再考虑自己继承PageRoute来实现一个页面跳转、页面过渡、动画、路由栈等等高级功能,目前我们不必从零开始构建这些基础功能!
Navigator路由
没有复杂深层链接的小型应用程序可以使用 Navigator,它是flutter内置的一套路由方案,Widgets/Material/CupertinoApp 都可以使用!
传统路由
命名路由
Navigator与MaterialApp.routes结合,将路由收集起来整理一个路由 表,像vue-router或react-router,这就叫做命名路由!
本质还是Navigator,命名路由 只是对以上传统路由的一种封装,便于管理和组织页面跳转,支持简单导航和深度链接要求!
最后分别在在页面点击事件的内容,修改为如下代码
命名路由的最大优点是直观,我们可以通过语义化的字符串来管理路由。但其有一个明显的缺点:不能直接传递路由参数。因此官方不建议使用命名路由。
go_router路由
针对更复杂的路由管理,具有高级导航和路由要求的 Flutter 应用程序,flutter 出品了一个三方包 go_router!

其实不用纠结,只要项目中用到了路由,直接上go_router即可!
与底部导航结合
如果你的项目中用到了tabbar,还想于路由结合,那么你只是简单的使用普通的方式 定义路由是行不通的。 这个时候你需要使用 ShellRoute , 或者 StatefulShellRoute,查看这里有更多内容!
路由参数
两种模式: 查询参数(query parameters)
路径参数(path parameters)
导航切换后参数未销毁
就比如我从 /teacher 跳转到/teacher/dtl?id=123,然后返回上一页 context.pop() ,这时在/teacher 里依然能看到这个参数。
这是go_router的特性,注意踩坑!