用途:这是一份 Kotlin Flow 的进阶参考,聚焦语义边界与常见陷阱,而非冷热流基础、操作符表或生命周期安全收集。
主要能力与要点: Channel 与 SharedFlow 选择:BroadcastChannel 迁移到 SharedFlow,ConflatedBroadcastChannel 迁移到 StateFlow(均已废弃);单消费者一次性事件(导航、Snackbar)保留 Channel(BUFFERED).receiveAsFlow();生产者-消费者队列保留 Channel。注意 receiveAsFlow() 是扇出而非广播,多收集者时每个事件只到一个收集者,需广播则用 SharedFlow。一次性事件用 collect 在 LaunchedEffect 中收集,不要用 collectAsStateWithLifecycle。 SharedFlow 发射:默认用 launch { emit() },避免 tryEmit 静默丢弃;tryEmit 仅用于可容忍丢失的效果。 只读流暴露:Kotlin 2.4+ 可用显式 backing field 单属性写法;Channel 暴露为 Flow 仍需 _events / receiveAsFlow() 成对写法。 回调桥接:单值用 suspendCancellableCoroutine;流用 callbackFlow,awaitClose 必须写,否则泄漏回调。 重试:retryWhen 必须限制 attempt 次数,否则持续错误会无限重试。 错误处理:.catch 只拦截上游错误且不吞 CancellationException;避免在 collect 内 catch (e: Exception) 吞掉取消异常。 副作用:变换 lambda 应保持纯,副作用放到 onEach;combine 需所有输入至少发射一次,否则可能一直 Loading。 KMP:共享代码暴露 Flow,各平台分别收集;避免在非协程 iOS 上下文读 StateFlow.value。 测试:Flow 测试见 android-testing,注意双调度器陷阱。
限制:资料未提供安装命令、版本要求细节、收费与平台信息;部分内容依赖 Kotlin 2.4+ 特性,低版本需用经典写法。