使用 Channel 处理一次性事件
安全地传递导航和 Toast 事件。
使用 Channel 处理一次性事件 是 CoddyKit 上的免费 Jetpack Compose Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Jetpack Compose Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Jetpack Compose Academy 课程共包含 4 节课。
本课时的部分内容尚未翻译,以英文显示。
State Is Not an Event
Some things should happen exactly once, like navigating or showing a toast. Modeling these as state causes them to replay on every rotation.
The Replay Problem
If you store a snackbar message in StateFlow, a configuration change re-reads it and the message pops up again unexpectedly.
Meet the Channel
A Channel is a hot pipe where each value is delivered to exactly one receiver and then consumed, never replayed.
private val _events = Channel<UiEvent>()Send Versus Emit
You push into a Channel with send, a suspend call. The event waits in the buffer until something is ready to receive it.
_events.send(UiEvent.NavigateBack)Expose as a Flow
Turn the channel into a stream for the UI with receiveAsFlow, which lets exactly one collector consume each event.
val events = _events.receiveAsFlow()Consumed Once, Forever
Once a collector takes an event from the Channel, it is gone. A later rotation cannot read it again, so no accidental replay.
Model Events as a Type
Define a sealed UiEvent type so every one-off action, like navigation or messages, is explicit and exhaustive.
sealed interface UiEvent {
data class ShowToast(val msg: String) : UiEvent
}Collect Events in Compose
Collect the event flow inside a LaunchedEffect so it ties to the screen lifecycle and runs each event handler once.
LaunchedEffect(Unit) {
events.collect { handle(it) }
}Choose the Buffer Policy
A default Channel suspends the sender if no one receives. You can give it a buffer so sends never block your logic.
Channel<UiEvent>(Channel.BUFFERED)SharedFlow Is an Alternative
A SharedFlow with replay zero can also carry events, but a Channel guarantees single delivery even with no active collector.
Keep State and Events Apart
The clean pattern: one StateFlow for screen state and one Channel for fire-once events. They never get confused again.
Quick Check
Decide what fits a one-off action.
Recap: One-Off Events
Awesome! A Channel delivers fire-once events like navigation and toasts exactly once, keeping them separate from replayable screen state. 🎯
常见问题解答
「使用 Channel 处理一次性事件」课时是免费的吗?
是的 — 「使用 Channel 处理一次性事件」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Jetpack Compose Academy 课程的其余内容,请升级到 CoddyKit PRO。 Jetpack Compose Academy 课程共包含 4 节课。
「使用 Channel 处理一次性事件」这节课中我会学到什么?
安全地传递导航和 Toast 事件。 你通过在浏览器中直接运行的动手代码来练习 Jetpack Compose Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Jetpack Compose Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Jetpack Compose Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「使用 Channel 处理一次性事件」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Jetpack Compose Academy 课中编写并运行代码吗?
能。每节 Jetpack Compose Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- StateFlow 与 SharedFlow
- 映射与组合 Flow
- stateIn 与 WhileSubscribed
- 使用 Channel 处理一次性事件