UI = Model 的反馈循环 · A Feedback Loop

一路演进
从手写 UI 到 @Observable

移动端「UI ⇄ 状态」绑定的十八年 —— iOS 与 Flutter 两条赛道,如何从命令式手动观察,走到细粒度声明式。

向下滚动 · scroll

objc 的《App Architecture》说,App 的本质就是 UI + Model:UI 发出动作触发 Model 更新,Model 更新又触发 UI 重建,循环往复。这一路的演进,讲的就是 「怎么把这个循环接起来」 —— 从亲手接线,到框架自动接线,再到只接「真正动了的那一根」。

◂ iOSFlutter ▸

心智负担,一路递减

同一个「乘法 ViewModel」,三个时代写下来 —— 样板越来越少,要记的规则越来越少。

2008 · 命令式
KVO / Notification
addObserver:forKeyPath:
observeValueForKeyPath:…
// dealloc 里手动 removeObserver
// 忘了就崩 / 泄漏
样板 & 心智负担
2019 · 响应式
@Published
@Published var result = "-"
// 框架自动管订阅生命周期
// 但要手动标 @Published
// @StateObject/@ObservedObject 易错
样板 & 心智负担
2023 · 细粒度
@Observable
@Observable
final class VM { var result = "-" }
// 一个宏搞定 · 属性级追踪
// 只重建真正读过的那块 UI
样板 & 心智负担

@Observable is all you need」

从亲手刷新每一个 label,到一个宏自动驱动整棵视图树 —— 十八年,框架替我们接管了那个反馈循环。
而 Flutter 的 Riverpod,也在同一条「踩坑 → 出坑」的路上,走向同一个方向:只重建真正依赖了变化数据的那一小块。