在讲 Riverpod 之前,我单独写了两篇文章,专门讲两种非常底层、非常通用的系统设计模式:
这两篇本身不属于 Riverpod,也不属于 Flutter,它们讲的是很多现代系统都在用的底层机制:一套负责"创建与生命周期",一套负责"依赖关系与自动传播"。
如果你已经读过这两篇,本文可以看成一个工程实例:
👉 Riverpod 是如何在 Flutter 中,把这两种机制组合成一套可直接使用的运行时依赖系统。
一、先把 Riverpod 从"状态管理"这个词里救出来
很多人一上来就说:
Riverpod 是 Flutter 的状态管理框架。
这句话不算错,但层级太低。
更准确的说法是:
👉 Riverpod 是一个运行时依赖系统(runtime dependency system) 。
状态管理,只是它最常见的一种使用场景。
Riverpod 真正解决的是:
- 谁在什么时候被创建
- 创建时依赖谁
- 谁依赖了谁
- 谁变了,谁该重建
- 谁没人用了,可以回收
而不是"怎么存一个 int"。
二、从一行代码,看 Riverpod 同时实现了两种模式
Dart
final userRepoProvider =
Provider((ref) => UserRepo(ref.read(apiProvider)));
这行代码同时落地了前两篇的两种设计模式。
✅ 1)这是"懒加载系统",不是变量
Dart
(ref) => UserRepo(...)
这不是 UserRepo。
这是:"如何创建 UserRepo 的方法"。
所以:
- 写 Provider 时 → 没创建任何对象
- 第一次 ref.read/watch 时 → 才执行这个方法
- 系统决定什么时候创建、销毁、重建
👉 这正是第一篇讲的:把创建权交给系统。
Riverpod 本质上是一个:
👉 带生命周期管理的 Factory Registry(工厂注册表)
✅ 2)这是"依赖登记系统",不是普通调用
Dart
ref.read(apiProvider)
表面看:取 api。
系统层面看:在创建 userRepo 的过程中,用到了 apiProvider。
也就是说,Riverpod 在这一刻,在内部依赖图里登记了一条边:
Dart
userRepoProvider → apiProvider
你没有写任何"依赖配置文件",
但一张依赖网已经开始生长了。
👉 这正是第二篇讲的:运行时依赖采集。
三、Riverpod 真正做的事:维护一张"活的依赖网"
当项目里有这些 Provider:
Dart
final apiProvider = Provider((ref) => Api());
final repoProvider = Provider((ref) => Repo(ref.read(apiProvider)));
final vmProvider = Provider((ref) => Vm(ref.read(repoProvider)));
Riverpod 在运行时,自动构建出一张图:
Dart
vmProvider → repoProvider → apiProvider
注意三点:
- 不是你声明的
- 不是注解扫出来的
- 是在执行创建函数时自动采集的
这张图是"活的":
- 有人 watch,它就存在
- 没人 watch,它可以被裁掉
- 上游变了,它会重新生长
四、为什么 Riverpod 能"自动更新 UI"?不是魔法
很多人把:
Dart
ref.watch(xxxProvider)
理解成"监听状态"。
但在系统层面,它真正做的是:
👉 把 UI 节点,也挂进了这张依赖网。
于是依赖网变成了:
Dart
Widget → vm → repo → api
当 api 变化:
- Riverpod 查图:谁依赖 api?repo
- repo 失效
- 查:谁依赖 repo?vm
- vm 失效
- 查:谁依赖 vm?Widget
- 👉 触发 Widget rebuild
所以 UI 自动刷新不是"Flutter 特性",
而是依赖图传播的自然结果。
五、为什么 Riverpod 能做到"精准刷新 + 自动回收"
一旦系统有了这张图,它立刻拥有两种关键能力:
✅ 1)精准刷新(不是全量刷新)
当某个 Provider 变了:
👉 不是"全 App 通知"
👉 是"顺着依赖边,只通知下游"
所以大工程里可以做到:
-
改一个小状态
-
只重建真正依赖它的那一撮 Widget
这就是 Riverpod 性能的来源,不是"写法技巧"。
✅ 2)自动回收(这是很多框架没有的)
当一个 Widget 不再 watch 某个 Provider:
-
这个 Provider 在图里变成"无根节点"
-
系统顺着图检查:它的上游是否还被别人需要
-
如果没有 → 整条链可以回收
所以 autoDispose 本质不是"自动销毁",
而是:
👉 依赖网裁剪。
六、重新给 Riverpod 一个准确定位
Riverpod 不是:
❌ 全局变量管理器
❌ setState 替代品
❌ MVVM 框架
它更准确的定位是:
✅ Flutter 运行时依赖系统
✅ 响应式依赖图引擎
✅ 带生命周期管理的工厂容器
状态管理,只是它跑在这套系统之上的一种应用层模式。