第 16 课2026.09.22
快速连续触发切换时,让每次更新都基于状态流的当前值。
第 16 课:原子切换 ViewModel 状态
- 日期:2026-09-22
- 课程序号:第 16 课
- 知识点:
MutableStateFlow.update
用途或适用场景
快速连续触发切换时,让每次更新都基于状态流的当前值。
核心概念
update { !it } 原子地更新 MutableStateFlow;回调可能被重试,所以只做纯值计算。
最小代码或操作示例
kotlin
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.ViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.update
class LessonViewModel(state: SavedStateHandle) : ViewModel() {
private val _running = MutableStateFlow(state["running"] ?: false)
val running: StateFlow<Boolean> = _running
fun toggle() { _running.update { current -> !current } }
}上一课的按钮仍调用 viewModel.toggle(),收集器根据 running 更新文字。
3~5 分钟练习
连续调用两次 toggle(),观察状态。
参考答案
状态从 false 到 true 再到 false,按钮文字先变“停止”再变“开始”。
与上一课的联系
沿用第 15 课的按钮监听器、LessonViewModel.toggle() 和同一 running 状态流;本课只把 ViewModel 内的切换改为 update;完成后下一课可旋转屏幕验证 ViewModel 状态仍被新界面读取。
时效校验
时效校验:2026-09-24(kotlinx-coroutines 1.11.0 MutableStateFlow.update 与 Android StateFlow 指南;未见废弃标记)。