一、为什么我会开始重新思考“路由”这件事

在前端、Android 或 Flutter 中做过一段时间开发后,很多人都会有一种感觉:

好像每个平台的路由都不太一样,
但又总觉得哪里“似曾相识”。

前端有路由表,Android 有 ARouter,Flutter 有 go_router。
API 不同、写法不同、运行环境不同,但当项目规模变大后,它们却不约而同地走向了同一个方向。

这并不是巧合。

二、一句话结论(先把结论放出来)

前端路由、Android ARouter、Flutter go_router,本质都是:

「声明式路由 + 全局导航治理」

它们之间真正的差异只在于:

  • 载体不同

  • 前端:URL
  • Android:注解 + path
  • Flutter:path / location
  • 运行环境不同

  • Web
  • Android
  • Flutter
  • 实现细节不同

👉 但核心抽象是完全一致的。

三、为什么“命令式跳转”一定会失控?

在项目早期,我们几乎都会使用命令式跳转:

  • 前端:router.push(...)
  • Android:startActivity(...)
  • Flutter:Navigator.push(...)

并且经常伴随着类似的逻辑:

if (!isLogin) {
    startLogin();
    return;
}
openOrderPage();

这种写法在页面少、入口少时完全没问题。
但当项目开始变复杂后,问题会迅速暴露:

  • 页面越来越多
  • 入口越来越多(深链、推送、外部唤起)
  • 登录态 / 权限 / 灰度逻辑不断叠加
  • 跳转逻辑散落在各个角落
  • 返回栈开始变得不可预测

你会发现一个非常现实的事实:

当“页面跳转”从每天 10 次,
变成每天 1000 次时,
命令式跳转一定会失控。

四、声明式路由到底“声明”了什么?

声明式路由,并不是“换了一套 API”,
而是换了一种思考方式

命令式跳转关心的是:

“我现在要跳到哪个页面?”

声明式路由关心的是:

“在当前状态下,用户应该处于哪个页面?”

于是,路由从“行为”变成了“状态映射”,并逐渐形成了几个共同特征:

  • 一张集中式路由表
  • 页面与“路径 / 状态”建立映射关系
  • 导航决策不再分散,而是统一治理

五、把三种路由放进同一张“思想坐标系”

1️⃣ 前端路由(Vue / React)

{
  path: '/order/:id',
  component: OrderPage,
  meta: { auth: true }
}

在前端世界中:

  • URL 本身就是状态

  • URL 变化 → 页面组件自动变化

  • 路由表是唯一可信来源

  • beforeEach 用于统一处理登录、权限、重定向

👉 前端最早、也最彻底地实践了
“路由即状态” 这件事。

2️⃣ Android ARouter

@Route(path = "/order/detail")
public class OrderDetailActivity extends Activity {}
ARouter.getInstance()
  .build("/order/detail")
  .navigation();

ARouter 的核心变化在于:

  • 页面不再由 Activity.class 直接决定
  • 而是由 path → 页面
  • 模块之间只暴露 path,彻底解耦
  • 拦截器集中处理登录、权限、埋点

👉 这是 Android 世界对
声明式路由 + 导航治理 的工程化落地。

3️⃣ Flutter go_router

GoRoute(
  path: '/order/:id',
  builder: (_, state) => OrderPage(id: ...)
);

在 Flutter 中:

  • path 描述页面结构
  • location 变化 → 页面自动更新
  • redirect 统一控制访问资格
  • 页面跳转不再到处 Navigator.push

👉 go_router 是 Flutter 中
最接近 Web 路由模型的方案
 

六、统一抽象对照表(核心)

抽象维度 前端路由 Android ARouter Flutter go_router
路由声明 path → component @Route(path) GoRoute(path)
导航状态 URL path location
跳转方式 修改 URL build(path).navigation context.go(path)
全局治理 beforeEach Interceptor redirect
页面呈现 组件 Activity Widget

👉 它们不是“像”,而是同一抽象在不同平台的实现。

七、为什么最终都会走向“全局导航治理”?

一旦你有以下需求中的任意一个:

  • 登录态变化需要影响所有页面
  • Token 失效要统一回登录页
  • 深链不能绕过权限控制
  • 灰度 / 强制升级 / 新手引导

你就不可能再靠:

“在每个按钮里 if 一下”

你必须在路由系统层面,统一做决策。

这正是以下机制存在的根本原因:

  • 前端:beforeEach
  • Android:Interceptor
  • Flutter:redirect

八、这一层理解真正带来的价值

当你意识到这是同一套思想之后:

  • 学新框架,不再是背 API

  • 看路由系统,只需要关注三点:

  1. 路由状态是什么?
  2. 路由表在哪里?
  3. 是否存在全局治理入口?

你会慢慢发现:

技术在变,抽象没变。

九、结语

声明式路由不是某个框架的“高级特性”,
而是复杂应用在规模化之后的必然选择

前端、Android、Flutter,
只是站在不同的平台上,
走到了同一条路上。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐