路由基础概念:从页面跳转说起

做 Flutter 开发这些年,我经常被问到:「路由不就是页面跳转吗?有什么好讲的?」

嗯,这话对了一半。页面跳转确实是路由最直观的体现,但路由体系远不止这么简单。今天我们就从最基础的概念开始,把路由这件事彻底聊透。

什么是路由?

路由(Route),说白了就是「页面切换的规则」。你想想看,用户点了一个按钮,从首页跳到了详情页——这个「怎么跳、跳到哪、跳完后能不能回来」的整套机制,就是路由。

在移动端开发里,路由通常包含三个核心要素:

  • 页面标识:每个页面都有一个唯一的名字或路径
  • 导航动作:push、pop、replace 这些操作
  • 参数传递:页面之间怎么传数据

我在项目中遇到过不少新手,直接把路由理解成「跳转函数」。其实路由更像是一张地图,告诉你从 A 到 B 该怎么走,路上有哪些关卡,走错了能不能回头。

为什么需要路由?

你可能会问:「我直接用 Navigator.push 不就行了?搞那么复杂干嘛?」

说实话,小项目确实可以这么干。但一旦项目上了规模,你就会发现:

  • 页面多了,跳转逻辑散落在各个地方,维护起来想哭
  • 深层嵌套的页面,返回时状态丢失了
  • 需要统一处理登录拦截、权限校验,结果每个页面都得写一遍
  • 想做个页面跳转动画,改起来牵一发动全身

这些都是我踩过的坑。所以后来我养成了一个习惯:不管项目大小,先搭好路由框架。这就像盖房子,地基打好了,后面怎么改都不慌。

核心观点:路由不是「跳转工具」,而是「页面管理方案」。它决定了你的 App 在页面流转时,是井然有序还是一团乱麻。

Flutter 中的路由体系概述

Flutter 的路由体系,其实分成了三个层次。我习惯把它们比作「手动挡、自动挡和智能驾驶」:

层次 代表方案 特点
基础路由 Navigator.push/pop 手动控制,灵活但代码分散
命名路由 Navigator.pushNamed 集中管理,适合中小项目
高级路由 GoRouter、Beamer 等 声明式、支持深度链接、Web 友好

基础路由,就是最原始的 Navigator.push。你直接 new 一个页面,push 进去。简单粗暴,但每个页面跳转都得写一遍 new 的代码。

// 基础路由示例
Navigator.push(
  context,
  MaterialPageRoute(builder: (context) => DetailPage(id: 123)),
);

命名路由稍微进了一步。你把所有页面注册到一个路由表里,跳转时只需要传个名字。这样跳转逻辑集中了,但参数传递还是有点麻烦。

// 命名路由示例
// 先在 MaterialApp 中注册
routes: {
  '/detail': (context) => DetailPage(),
}

// 跳转时
Navigator.pushNamed(context, '/detail');

高级路由方案,比如 GoRouter,是我现在最常用的。它用声明式的方式定义路由,支持路径参数、嵌套路由、重定向、动画配置……几乎你能想到的,它都帮你处理好了。

// GoRouter 示例
final router = GoRouter(
  routes: [
    GoRoute(
      path: '/',
      builder: (context, state) => HomePage(),
    ),
    GoRoute(
      path: '/detail/:id',
      builder: (context, state) => DetailPage(
        id: state.pathParameters['id']!,
      ),
    ),
  ],
);

我的建议:如果你刚开始学 Flutter,先用基础路由把概念搞懂。等项目到了 10 个页面以上,果断上 GoRouter。别问我怎么知道的——我曾经在一个 30 页的项目里用基础路由,改到怀疑人生。

路由的生命周期

这一点很多人会忽略。路由不是「跳过去就完了」,它有自己的生命周期:

  • 初始化:页面被创建,接收参数
  • 激活:页面显示在屏幕上
  • 暂停:页面被覆盖(比如弹出了对话框)
  • 恢复:页面重新回到前台
  • 销毁:页面被 pop 掉,释放资源

我记得有一次,一个同事在页面销毁时忘记取消网络请求,结果页面关了还在回调里更新 UI,直接崩溃。嗯,这就是没理解路由生命周期的代价。

注意:Flutter 的路由栈是「后进先出」的。你 push 了 5 个页面,按返回键会依次 pop 回去。如果你需要跳转到某个页面并清空栈,记得用 pushReplacement 或 pushAndRemoveUntil。

小结

路由基础概念,说白了就是三件事:怎么跳、怎么传参、怎么管理页面栈。别小看这些基础,后面所有的架构设计都是在这个地基上盖起来的。

下一章,我们会深入 Navigator 的源码,看看 Flutter 到底是怎么管理这些页面的。到时候你会发现,原来路由的底层实现,比想象中要优雅得多。


公众号:蓝海资料掘金营,微信deep3321