一、一句话说清:Flow 是什么?

Flow = 协程版的「数据流」

用来处理 异步、连续、多个值 的序列。

类比一下你就懂:

  • 返回单个值suspend fun:协程挂起函数

  • 返回多个连续值Flow<T>:数据流

它就是协程世界里的 RxJava / LiveData,但更轻、更简单、更原生。


二、Flow 解决了什么问题?

以前你处理异步多值会遇到:

  1. 回调嵌套(回调地狱)

  2. 线程管理混乱

  3. 取消不安全

  4. 生命周期不好管理

  5. 数据变换写起来麻烦

Flow 全部一次性解决,而且代码是同步风格的。


三、Flow 三大核心特性(必须记住)

1. 冷数据流(Cold Stream)

  • 没人收集(collect)就不执行

  • 谁收集,谁就触发执行

  • 不共享数据(默认)

对比:

  • 冷 Flow:你打开水龙头才出水

  • 热 Flow(SharedFlow/StateFlow):水龙头一直流水,你来就接

2. 挂起函数 + 协程无缝集成

所有操作都是 suspend 的,天然支持:

  • 取消

  • 异常

  • 结构化并发

  • 线程切换

3. 函数式操作符,像集合一样简单

你可以像处理 List 一样处理数据流:

mapfilterflatMapConcattransformcatchonStart...


四、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 的核心角色

  1. flow { ... }

    生产者,用 emit() 发送数据

  2. map/filter/transform...

    中间操作,加工数据

  3. collect{}

    末端操作,开始接收数据(只有调用它才会跑)


六、Flow 分类(最重要的区分)

1. 冷 Flow(普通 Flow)

  • 默认就是

  • 不收集不执行

  • 不共享

  • 适合:网络请求、数据库读取、单次任务

2. 热 Flow

StateFlow

  • 当前状态值

  • 总是有值

  • 适合:UI 状态(ViewModel 里用得最多)

SharedFlow

  • 可配置重播

  • 多观察者共享数据

  • 适合:事件总线、一次性事件


七、Flow 为什么比 RxJava / LiveData 强?

  1. :就是协程扩展,没有额外负担

  2. 结构化并发:自动取消,不会泄漏

  3. 异常安全

  4. 代码简洁:没有背压复杂概念

  5. 官方亲儿子:Jetpack 全家桶默认支持


八、总结

  • Flow = 协程版数据流

  • 处理异步多个值

  • 冷数据 → 不收集不执行

  • 函数式操作 + 协程取消 / 异常安全

  • StateFlow 专用于 UI 状态