0Pricing
Android Academy · 课时

StateFlow 和 SharedFlow

从应用中公开响应式状态

StateFlow 和 SharedFlow 是 CoddyKit 上的免费 Android Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Android Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Android Academy 课程共包含 4 节课。

热流

与冷流不同,StateFlow 和 SharedFlow 是热流:它们独立于收集者存在,并且可以由多个收集者共享。

StateFlow 是状态持有者

StateFlow 始终持有一个当前值。新的收集者会立即收到最新值。它非常适合表示界面状态。

private val _count = MutableStateFlow(0)
val count: StateFlow<Int> = _count.asStateFlow()

更新 StateFlow

可以直接设置 .value,也可以使用 update 执行原子性的读取-修改-写入操作。

_count.value++
// or, atomically:
_count.update { it + 1 }

StateFlow 会合并并去重

StateFlow 只保留最新值(合并),并且在新值等于旧值时跳过发出操作。这样可以避免多余的界面更新。

使用 SharedFlow 表示事件

SharedFlow不要求存在当前值,并且可以重放可配置数量的历史发出值。它适合表示导航或显示提示条等一次性事件。

private val _events = MutableSharedFlow<String>()
val events: SharedFlow<String> = _events.asSharedFlow()

发出事件

在协程中向 SharedFlow 发出事件。

fun onSave() {
    viewModelScope.launch {
        _events.emit("Saved!")
    }
}

为什么不使用 StateFlow 表示事件

StateFlow 会保留最后一个值,因此重新订阅的收集者(例如屏幕旋转后)会再次收到旧事件,可能导致重复导航。SharedFlow 默认不会重放事件,因此可以避免这一问题。

配置 SharedFlow

调整 replay 和 extraBufferCapacity,以控制缓冲和背压行为。

MutableSharedFlow<String>(
    replay = 0,
    extraBufferCapacity = 1
)

将冷 Flow 转换为 StateFlow

使用 stateIn 将冷上游转换为共享的 StateFlow,并将其作用域限定在 ViewModel 中。

val uiState = repo.stream()
    .stateIn(
        viewModelScope,
        SharingStarted.WhileSubscribed(5000),
        UiState()
    )

如何选择

  • StateFlow → 当前屏幕状态(始终有值)。
  • SharedFlow → 瞬态事件(只触发一次)。

同时收集两者

在 Compose 中使用 collectAsStateWithLifecycle 收集 StateFlow;在 LaunchedEffect 中收集 SharedFlow 事件,以便只处理一次。

LaunchedEffect(Unit) {
    vm.events.collect { msg -> showSnackbar(msg) }
}

快速检查

测试您对 StateFlow 和 SharedFlow 的理解。

回顾

您学到了:

  • StateFlow 是一种热流式、合并更新的状态持有者,并且始终具有当前值。
  • SharedFlow 是一种支持配置重放的热事件流。
  • 使用 StateFlow 表示状态,使用 SharedFlow 表示一次性事件。
  • stateIn 可将冷流转换为 StateFlow。

常见问题解答

「StateFlow 和 SharedFlow」课时是免费的吗?

是的 — 「StateFlow 和 SharedFlow」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Android Academy 课程的其余内容,请升级到 CoddyKit PRO。 Android Academy 课程共包含 4 节课。

「StateFlow 和 SharedFlow」这节课中我会学到什么?

从应用中公开响应式状态 你通过在浏览器中直接运行的动手代码来练习 Android Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Android Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Android Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「StateFlow 和 SharedFlow」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Android Academy 课中编写并运行代码吗?

能。每节 Android Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 协程基础和作用域
  2. viewModelScope 和调度器
  3. Kotlin Flow 基础
  4. StateFlow 和 SharedFlow
← 返回 Android Academy