使用 Flow 观察数据
以响应式方式响应数据库变化
使用 Flow 观察数据 是 CoddyKit 上的免费 Android Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Android Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Android Academy 课程共包含 4 节课。
响应式数据库读取
Room 不仅可以只查询一次,还可以返回一个 Flow,每当底层数据发生变化时,它都会发出一个新值。您的界面会自动更新。
从 DAO 返回 Flow
将返回类型声明为 Flow<...>。请注意,它不是挂起函数。
@Query("SELECT * FROM users ORDER BY name")
fun observeUsers(): Flow<List<User>>为什么这里不使用 suspend
suspend 函数返回单个结果后就会结束。Flow 是持续的流,因此它是一个返回流对象的普通函数;您可以随着时间推移收集它。
Room 如何知道要重新发出数据
Room 会跟踪查询涉及的表。当任何写入操作影响这些表时,Room 会重新运行查询,并通过 Flow 发出最新结果。这一切都是自动完成的。
在协程中收集
您可以在协程中收集流,通常是在 ViewModel 中进行。
viewModelScope.launch {
dao.observeUsers().collect { users ->
_uiState.value = UiState(users)
}
}映射 Flow
在公开流之前,您可以使用 map 等运算符转换它。
val names: Flow<List<String>> =
dao.observeUsers().map { list ->
list.map { it.name }
}将其转换为 StateFlow
使用 stateIn 将 DAO 的冷 Flow 转换为供界面使用的热 StateFlow。
val uiState = dao.observeUsers()
.map { UiState(it) }
.stateIn(
viewModelScope,
SharingStarted.WhileSubscribed(5000),
UiState()
)在 Compose 中收集
该屏幕会以感知生命周期的方式收集状态,具体方式与您之前学过的一样。
@Composable
fun UsersScreen(vm: UserViewModel) {
val state by vm.uiState
.collectAsStateWithLifecycle()
UserList(state.users)
}完整的响应式链路
将它们组合起来:
- 数据发生变化时,Room 发出新值。
- ViewModel 通过
stateIn将数据映射为界面状态。 - Compose 使用
collectAsStateWithLifecycle进行收集。
无论在哪里写入数据库,屏幕都会自行刷新。
单一事实来源
这种模式让数据库成为单一事实来源。界面不会持有过时的副本,而是始终反映实际存储的数据。
写入会触发更新
对被监视表执行插入、更新或删除操作时,Flow 都会重新发出数据,因此更改后无需手动刷新列表。
suspend fun addUser(u: User) = dao.insert(u)
// observeUsers() flow re-emits automatically快速检查
测试您对使用 Flow 观察数据的理解。
回顾
您学会了:
- 返回
Flow的 DAO 方法会在数据变化时重新发出数据。 - 这些方法是返回流的普通(非挂起)函数。
- 使用
stateIn+collectAsStateWithLifecycle以响应式方式驱动界面。 - 数据库成为单一事实来源。
常见问题解答
「使用 Flow 观察数据」课时是免费的吗?
是的 — 「使用 Flow 观察数据」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Android Academy 课程的其余内容,请升级到 CoddyKit PRO。 Android Academy 课程共包含 4 节课。
「使用 Flow 观察数据」这节课中我会学到什么?
以响应式方式响应数据库变化 你通过在浏览器中直接运行的动手代码来练习 Android Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Android Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Android Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「使用 Flow 观察数据」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Android Academy 课中编写并运行代码吗?
能。每节 Android Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。