一、一句话说清:Flow 是什么?
Flow = 协程版的「数据流」
用来处理 异步、连续、多个值 的序列。
类比一下你就懂:
返回单个值:
suspend fun:协程挂起函数返回多个连续值:
Flow<T>:数据流
它就是协程世界里的 RxJava / LiveData,但更轻、更简单、更原生。
二、Flow 解决了什么问题?
以前你处理异步多值会遇到:
回调嵌套(回调地狱)
线程管理混乱
取消不安全
生命周期不好管理
数据变换写起来麻烦
Flow 全部一次性解决,而且代码是同步风格的。
三、Flow 三大核心特性(必须记住)
1. 冷数据流(Cold Stream)
没人收集(collect)就不执行
谁收集,谁就触发执行
不共享数据(默认)
对比:
冷 Flow:你打开水龙头才出水
热 Flow(SharedFlow/StateFlow):水龙头一直流水,你来就接
2. 挂起函数 + 协程无缝集成
所有操作都是 suspend 的,天然支持:
取消
异常
结构化并发
线程切换
3. 函数式操作符,像集合一样简单
你可以像处理 List 一样处理数据流:
map、filter、flatMapConcat、transform、catch、onStart...
四、Flow 最简单代码示例(一看就会)
kotlin
// 1. 发射数据流(生产者)
fun numberFlow(): Flow<Int> = flow {
emit(1)
delay(1000)
emit(2)
delay(1000)
emit(3)
}
// 2. 收集数据(消费者)
lifecycleScope.launch {
numberFlow().collect {
println("收到:$it")
}
}
输出:
plaintext
收到:1
(1秒后)
收到:2
(1秒后)
收到:3
超级清爽,没有回调。
五、Flow 的核心角色
flow { ... }
生产者,用
emit()发送数据map/filter/transform...
中间操作,加工数据
collect{}
末端操作,开始接收数据(只有调用它才会跑)
六、Flow 分类(最重要的区分)
1. 冷 Flow(普通 Flow)
默认就是
不收集不执行
不共享
适合:网络请求、数据库读取、单次任务
2. 热 Flow
StateFlow
有当前状态值
总是有值
适合:UI 状态(ViewModel 里用得最多)
SharedFlow
可配置重播
多观察者共享数据
适合:事件总线、一次性事件
七、Flow 为什么比 RxJava / LiveData 强?
轻:就是协程扩展,没有额外负担
结构化并发:自动取消,不会泄漏
异常安全
代码简洁:没有背压复杂概念
官方亲儿子:Jetpack 全家桶默认支持
八、总结
Flow = 协程版数据流
处理异步多个值
冷数据 → 不收集不执行
函数式操作 + 协程取消 / 异常安全
StateFlow 专用于 UI 状态
Kotlin Flow 一 概述
https://lautung.com/archives/Ps4Yk9If