单点组件不够用

单独用 ViewModel、单独用 Room,都不难。难的是把它们串成一条稳的链路:数据怎么进库、怎么变成界面状态、界面改了怎么回写、页面之间怎么跳转。各组件若各写各的,状态很容易不同步,界面和数据各说各话。这篇讲整合。

架构组件不是各管各的,它们本来就是为串起来设计的。

这篇把 ViewModel、Room、Flow、导航整合成一条完整数据流。

分层总览

从上到下三层:界面层收集状态画界面,ViewModel 持有状态并调度,数据层由仓库和 Room 提供数据流。各层只依赖下一层,方向单一,谁也不反过来依赖谁。这种单向依赖让代码层次清楚,改动一层不容易波及其它层。

整合速查
  • 数据层Room 暴露 Flow。
  • ViewModel转成界面状态。
  • 界面收集状态画 UI。

Room 提供数据流

Room 查询返回 Flow,数据一变它自动发新值。

@Query("SELECT * FROM items ORDER BY id DESC")
fun all(): Flow<List<Item>>

数据库成了一个会自己推送的数据源头。

ViewModel 桥接

ViewModel 把仓库的 Flow 转成界面状态,界面不用管数据怎么来的。

安卓 Jetpack:抽象架构分层堆叠由发光数据流线连接整合的蓝调插画
分层堆叠,数据流线串联各层。