以下是 Android 开发中 Kotlin Flow 的常见使用模式和操作符的完整中文总结:
1. 基本 Flow 创建方式
kotlin
// 从多个值创建
val flow1 = flowOf(1, 2, 3)
// 使用 flow 构建器
val flow2 = flow {
emit(1)
delay(100)
emit(2)
}
// 从集合创建
val flow3 = listOf(1, 2, 3).asFlow()
2. 转换操作符
kotlin
someFlow
.map { it * 2 } // 转换每个值
.filter { it > 0 } // 过滤值
.take(3) // 取前3个值
.drop(1) // 跳过前1个值
.distinctUntilChanged() // 只有值变化时才发射
3. Flow 组合
kotlin
// 合并最新值
val combined = combine(flow1, flow2) { a, b ->
"$a-$b"
}
// 按对应顺序压缩
val zipped = flow1.zip(flow2) { a, b ->
"$a-$b"
}
// 合并多个 Flow(谁先来发谁)
val merged = merge(flow1, flow2)
4. 创建 StateFlow
kotlin
// 从 MutableStateFlow 创建
private val _state = MutableStateFlow(0)
val state: StateFlow<Int> = _state.asStateFlow()
// 从 Flow 转换为 StateFlow
val stateFlow = someFlow.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5000),
initialValue = defaultValue
)
5. Flow 控制操作
kotlin
someFlow
.debounce(300) // 防抖处理
.buffer(Channel.BUFFERED) // 缓存处理
.retry(3) // 出错重试3次
.catch { e -> handle(e) } // 错误捕获处理
.onStart { showLoading() } // 开始前回调
.onCompletion { hideLoading() } // 完成后回调
6. 调度与线程切换
kotlin
someFlow
.flowOn(Dispatchers.IO) // 指定上游线程
.conflate() // 合并中间值(只保留最新)
.buffer() // 用独立协程缓冲
7. SharedFlow 使用
kotlin
private val _events = MutableSharedFlow<Event>(
replay = 0,
extraBufferCapacity = 1
)
val events = _events.asSharedFlow()
8. Flow 收集方式
kotlin
// 在 ViewModel 中
someFlow
.onEach { /* 处理数据 */ }
.launchIn(viewModelScope)
// 在 UI 中
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.state.collect { /* 更新 UI */ }
}
}
9. Flow 单元测试
kotlin
@Test
fun testFlow() = runTest {
val flow = flowOf(1, 2, 3)
.map { it * 2 }
.toList()
assertEquals(listOf(2, 4, 6), flow)
}
10. Flow 错误处理
kotlin
someFlow
.catch { e -> emit(fallback) } // 捕获错误并恢复
.retryWhen { cause, attempt -> // 高级重试机制
attempt < 3 && cause is NetworkError
}
这些模式涵盖了 Android 开发中 Kotlin Flow 的大多数使用场景,如状态管理、UI 响应、组合流、错误处理和性能优化等。
二 关于 Flow 的关键知识:
- Flow 的基本写法和操作符:
- stateIn: 将普通 Flow 转为 StateFlow,提供初始值和生命周期控制
- combine: 合并多个 Flow,任一 Flow 更新都会触发重新计算
- map: 对 Flow 中的每个元素进行转换
- onEach: 用于执行副作用
- Flow 相比 LiveData 的优势:
- 更好的数据流组合能力(combine)
- 原生支持异步操作
- 支持流控(如 debounce)
- 更友好的测试支持
- 与 Jetpack Compose 完全兼容
- Flow 的常见使用场景:
- ViewModel 向 UI 层暴露状态
- 实现防抖和节流
- 处理一次性事件(SharedFlow)
- 数据库和网络请求响应式处理
- Flow 的最佳实践:
- 在 ViewModel 中使用 StateFlow/SharedFlow
- 使用 repeatOnLifecycle 进行生命周期感知的收集
- 合理使用操作符组合流
- 处理错误和异常情况
- 在测试中使用 runTest
- Flow 在企业级应用中的应用:
- 可用于实现 MVI 架构
- 处理复杂的状态管理
- 实现多模块通信
- 处理用户交互事件
这些知识点是理解和使用 Flow 的基础。在实际开发中,需要根据具体场景选择合适的 Flow API 和使用方式。