stateIn 与 WhileSubscribed
缓存数据流,并在无人监听时停止工作。
stateIn 与 WhileSubscribed 是 CoddyKit 上的免费 Jetpack Compose Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Jetpack Compose Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Jetpack Compose Academy 课程共包含 4 节课。
从冷流到热状态
界面状态应当是热的并且经过缓存,但经过转换的数据流是冷的。stateIn 运算符可以将冷流转换为 StateFlow。
stateIn 的作用
stateIn 会在一个作用域中启动上游流,在所有收集器之间共享一次收集,并为新的收集器缓存最新值。
val ui = source.stateIn(
viewModelScope, started, initial)它需要一个作用域
第一个参数是作用域,通常是 viewModelScope,它会将正在运行的数据流与 ViewModel 的生命周期关联起来。
flow.stateIn(viewModelScope, ...)它需要一个初始值
由于 StateFlow 始终持有一个值,stateIn 要求提供一个初始值,以便在第一个真实值发出前显示。
flow.stateIn(scope, started,
initialValue = UiState.Loading)共享策略
中间参数是 SharingStarted 策略。它会精确决定上游流何时开始和停止运行。
Eagerly 与 Lazily
SharingStarted.Eagerly 会立即启动数据流且永不停止,而 Lazily 会在第一个收集器出现时启动,并持续运行。
started = SharingStarted.Eagerly认识 WhileSubscribed
WhileSubscribed 只会在至少存在一个活跃收集器时运行上游流,并在最后一个收集器离开后停止。
started = SharingStarted.WhileSubscribed()五秒超时
为 WhileSubscribed 传入较短的超时时间,可以让数据流在最后一个收集器离开后短暂保持运行,从而应对快速的屏幕旋转。
SharingStarted.WhileSubscribed(5000)超时时间为何有帮助
屏幕旋转期间,旧的收集器会离开,新的收集器会在片刻后到来。超时时间可以避免在两者之间进行不必要的重启。
停止浪费工作
使用 WhileSubscribed 时,屏幕关闭后数据库或网络数据流会暂停,用户返回后再恢复。这样可以节省电量。🔋
完整的 stateIn 配方
把它们组合起来:先转换数据,然后使用作用域、WhileSubscribed 和初始加载状态调用 stateIn。
val ui = repo.flow().map { UiState(it) }
.stateIn(viewModelScope,
SharingStarted.WhileSubscribed(5000),
UiState.Loading)快速检查
思考由订阅者驱动的生命周期。
回顾:stateIn 与 WhileSubscribed
做得好!stateIn 会将冷流转换为经过缓存的 StateFlow,而 WhileSubscribed 只会在数据流被观察时运行,从而避免浪费工作。🎯
用 AI 导师学习 Kotlin — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 30
- 课程
- 120
常见问题解答
「stateIn 与 WhileSubscribed」课时是免费的吗?
是的 — 「stateIn 与 WhileSubscribed」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Jetpack Compose Academy 课程的其余内容,请升级到 CoddyKit PRO。 Jetpack Compose Academy 课程共包含 4 节课。
「stateIn 与 WhileSubscribed」这节课中我会学到什么?
缓存数据流,并在无人监听时停止工作。 你通过在浏览器中直接运行的动手代码来练习 Jetpack Compose Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Jetpack Compose Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Jetpack Compose Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「stateIn 与 WhileSubscribed」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Jetpack Compose Academy 课中编写并运行代码吗?
能。每节 Jetpack Compose Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- StateFlow 与 SharedFlow
- 映射与组合 Flow
- stateIn 与 WhileSubscribed
- 使用 Channel 处理一次性事件