Kotlin Flow API 完整列表
📚 目录
- Flow 创建操作符
- Flow 转换操作符
- Flow 过滤操作符
- Flow 组合操作符
- Flow 异常处理操作符
- Flow 生命周期操作符
- Flow 线程切换操作符
- Flow 终端操作符
- Flow 背压处理操作符
- 项目中实际使用的API
- [参考新项目] juejin.cn/post/722376…
Flow 创建操作符
1. flow { } ⭐ 项目中已使用
flow {
emit(1)
emit(2)
emit(3)
}
用途: 创建冷流(Cold Flow),通过 emit() 发射数据
项目使用: lib_network/flow/FlowExt.kt、lib_framework/ext/FlowExt.kt
2. flowOf()
flowOf(1, 2, 3, 4, 5)
用途: 创建包含固定值的Flow
3. asFlow()
listOf(1, 2, 3).asFlow()
(1..5).asFlow()
用途: 将集合、数组、区间转换为Flow
4. callbackFlow { } ⭐ 项目中已使用
callbackFlow {
val callback = object : Callback {
override fun onResult(data: String) {
offer(data) // 或 trySend(data)
}
}
registerCallback(callback)
awaitClose { unregisterCallback(callback) }
}
用途: 将基于回调的API转换为Flow
项目使用: lib_framework/ext/EditTtextExt.kt - EditText文本变化监听
5. channelFlow { }
channelFlow {
send(1)
send(2)
}
用途: 创建热流(Hot Flow),支持并发发送
6. emptyFlow()
emptyFlow<Int>()
用途: 创建空的Flow
Flow 转换操作符
7. map { }
flow.map { it * 2 }
用途: 转换每个元素
8. transform { }
flow.transform { value ->
emit(value * 2)
emit(value * 3)
}
用途: 可以发射多个值,更灵活的转换
9. flatMapConcat { }
flow.flatMapConcat { value ->
flowOf(value, value * 2)
}
用途: 顺序合并多个Flow
10. flatMapMerge { }
flow.flatMapMerge { value ->
flowOf(value, value * 2)
}
用途: 并发合并多个Flow
11. flatMapLatest { } ⭐ 项目中已导入(注释中)
flow.flatMapLatest { value ->
searchFlow(value.toString())
}
用途: 只处理最新的Flow,取消之前的Flow
项目使用: mod_login 中注释代码有提到
12. scan()
flow.scan(0) { acc, value -> acc + value }
用途: 累积计算(类似reduce,但会发射中间结果)
13. onEach { } ⭐ 项目中已使用
flow.onEach { value ->
println(value)
}
用途: 对每个元素执行操作,但不改变元素
项目使用: LoginActivity.kt、RegisterActivity.kt、FlowExt.kt
Flow 过滤操作符
14. filter { }
flow.filter { it > 5 }
用途: 过滤符合条件的元素
15. filterNot { }
flow.filterNot { it.isEmpty() }
用途: 过滤不符合条件的元素
16. filterIsInstance<T>()
flow.filterIsInstance<String>()
用途: 过滤指定类型的元素
17. take(n)
flow.take(5)
用途: 取前n个元素
18. takeWhile { }
flow.takeWhile { it < 10 }
用途: 取满足条件的元素,遇到不满足时停止
19. drop(n)
flow.drop(5)
用途: 跳过前n个元素
20. dropWhile { }
flow.dropWhile { it < 5 }
用途: 跳过满足条件的元素
21. distinctUntilChanged()
flow.distinctUntilChanged()
用途: 过滤连续重复的元素
Flow 组合操作符
22. zip()
flow1.zip(flow2) { a, b -> a + b }
用途: 组合两个Flow,一一对应
23. combine()
flow1.combine(flow2) { a, b -> a + b }
用途: 组合两个Flow,任一Flow有新值就组合
24. merge()
merge(flow1, flow2, flow3)
用途: 合并多个Flow
Flow 异常处理操作符
25. catch { } ⭐ 项目中已使用
flow.catch { e ->
println("Error: $e")
}
用途: 捕获上游异常
项目使用: lib_network/flow/FlowExt.kt - 网络请求异常处理
26. onErrorReturn()
flow.onErrorReturn(0)
用途: 发生异常时返回默认值
27. onErrorResume { }
flow.onErrorResume { e ->
flowOf(0)
}
用途: 发生异常时返回另一个Flow
28. retry()
flow.retry(3)
flow.retry(3) { e -> e is IOException }
用途: 重试指定次数
29. retryWhen { }
flow.retryWhen { cause, attempt ->
attempt < 3 && cause is IOException
}
用途: 根据条件重试
Flow 生命周期操作符
30. onStart { } ⭐ 项目中已使用
flow.onStart {
println("Flow started")
}
用途: Flow开始收集时执行
项目使用: lib_network/flow/FlowExt.kt、lib_framework/ext/FlowExt.kt
31. onCompletion { } ⭐ 项目中已使用
flow.onCompletion { cause ->
if (cause == null) {
println("Flow completed successfully")
} else {
println("Flow completed with error: $cause")
}
}
用途: Flow完成时执行(无论成功或失败)
项目使用: lib_network/flow/FlowExt.kt、lib_framework/ext/FlowExt.kt
32. onEmpty { }
flow.onEmpty {
emit(0)
}
用途: Flow为空时执行
Flow 线程切换操作符
33. flowOn(Dispatchers) ⭐ 项目中已使用
flow.flowOn(Dispatchers.IO)
用途: 指定Flow执行的线程(影响上游操作符)
项目使用: 所有Flow使用场景
Flow 背压处理操作符
34. buffer()
flow.buffer()
flow.buffer(10) // 指定缓冲区大小
用途: 缓冲元素,减少背压
35. conflate()
flow.conflate()
用途: 只保留最新的值,丢弃中间值
36. collectLatest { }
flow.collectLatest { value ->
// 如果新值到达,取消当前处理
}
用途: 收集最新值,取消之前的处理
Flow 时间相关操作符
37. debounce(timeoutMillis) ⭐ 项目中已使用
flow.debounce(300)
用途: 防抖,只在指定时间内没有新值时才发射
项目使用: LoginActivity.kt、RegisterActivity.kt - 输入框防抖
38. sample(periodMillis)
flow.sample(1000)
用途: 采样,定期发射最新值
39. throttleFirst(periodMillis)
flow.throttleFirst(1000)
用途: 节流,在指定时间内只发射第一个值
40. throttleLatest(periodMillis)
flow.throttleLatest(1000)
用途: 节流,在指定时间内只发射最新的值
Flow 终端操作符
41. collect { } ⭐ 项目中已使用
flow.collect { value ->
println(value)
}
用途: 收集Flow的所有值(挂起函数)
项目使用: lib_network/flow/FlowExt.kt
42. collectIndexed { }
flow.collectIndexed { index, value ->
println("$index: $value")
}
用途: 带索引的收集
43. launchIn(scope) ⭐ 项目中已使用
flow.launchIn(lifecycleScope)
用途: 在指定作用域中启动Flow收集(不挂起)
项目使用: LoginActivity.kt、RegisterActivity.kt、FlowExt.kt
44. first()
val first = flow.first()
用途: 获取第一个值
45. firstOrNull()
val first = flow.firstOrNull()
用途: 获取第一个值,如果没有则返回null
46. single()
val value = flow.single()
用途: 确保Flow只发射一个值
47. singleOrNull()
val value = flow.singleOrNull()
用途: 获取单个值,如果没有或超过一个则返回null
48. toList()
val list = flow.toList()
用途: 收集所有值到List
49. toSet()
val set = flow.toSet()
用途: 收集所有值到Set
50. fold(initial) { }
val sum = flow.fold(0) { acc, value -> acc + value }
用途: 累积计算,返回最终结果
51. reduce { }
val sum = flow.reduce { acc, value -> acc + value }
用途: 累积计算,第一个值作为初始值
52. count()
val count = flow.count()
用途: 计算元素数量
53. count { }
val count = flow.count { it > 5 }
用途: 计算满足条件的元素数量
Flow 状态操作符
54. stateIn(scope, started, initialValue)
val stateFlow = flow.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5000),
initialValue = 0
)
用途: 将Flow转换为StateFlow
55. shareIn(scope, started, replay)
val sharedFlow = flow.shareIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5000),
replay = 1
)
用途: 将Flow转换为SharedFlow
Flow 其他操作符
56. cancellable()
flow.cancellable()
用途: 使Flow可取消
57. onSubscription { }
flow.onSubscription {
println("Subscribed")
}
用途: 订阅时执行(SharedFlow/StateFlow)
58. onEach { } (已列出,见转换操作符)
项目中实际使用的API
✅ 已使用的API列表
| API | 使用位置 | 用途 |
|---|---|---|
flow { } | FlowExt.kt | 创建网络请求Flow和倒计时Flow |
callbackFlow { } | EditTtextExt.kt | 将EditText文本变化转换为Flow |
flowOn() | 所有使用场景 | 指定Flow执行线程 |
onStart { } | FlowExt.kt | 请求开始显示加载框 |
onCompletion { } | FlowExt.kt | 请求完成隐藏加载框 |
catch { } | FlowExt.kt | 捕获网络请求异常 |
collect { } | FlowExt.kt | 收集网络请求结果 |
onEach { } | LoginActivity.kt、RegisterActivity.kt | 处理每个文本变化事件 |
debounce() | LoginActivity.kt、RegisterActivity.kt | 输入框防抖 |
launchIn() | 所有Activity使用场景 | 在生命周期作用域中启动Flow |
📝 已导入但未使用的API
| API | 导入位置 | 状态 |
|---|---|---|
flatMapLatest { } | RegisterActivity.kt | 已导入但代码被注释 |
常用API组合示例
1. 网络请求(项目中使用的模式)
flow {
emit(requestCall())
}
.flowOn(Dispatchers.IO)
.onStart { showLoading(true) }
.catch { e -> handleError(e) }
.onCompletion { showLoading(false) }
.collect { result -> handleResult(result) }
2. 输入框监听(项目中使用的模式)
editText.textChangeFlow()
.debounce(300)
.flowOn(Dispatchers.IO)
.onEach { updateUI(it) }
.launchIn(lifecycleScope)
3. 倒计时(项目中使用的模式)
flow {
for (i in total downTo 0) {
emit(i)
delay(1000)
}
}
.flowOn(Dispatchers.Main)
.onStart { onStart() }
.onCompletion { onFinish() }
.onEach { onTick(it) }
.launchIn(scope)
总结
项目中使用的核心API(10个)
- ✅
flow { }- 创建Flow - ✅
callbackFlow { }- 回调转Flow - ✅
flowOn()- 线程切换 - ✅
onStart { }- 开始回调 - ✅
onCompletion { }- 完成回调 - ✅
catch { }- 异常捕获 - ✅
collect { }- 收集数据 - ✅
onEach { }- 处理每个元素 - ✅
debounce()- 防抖 - ✅
launchIn()- 启动收集
Flow API分类统计
- 创建操作符: 6个(项目中用2个)
- 转换操作符: 7个(项目中用1个)
- 过滤操作符: 8个(项目中用0个)
- 组合操作符: 3个(项目中用0个)
- 异常处理操作符: 5个(项目中用1个)
- 生命周期操作符: 3个(项目中用2个)
- 线程切换操作符: 1个(项目中用1个)
- 背压处理操作符: 3个(项目中用0个)
- 时间相关操作符: 4个(项目中用1个)
- 终端操作符: 13个(项目中用2个)
- 状态操作符: 2个(项目中用0个)
总计: 约58个常用API,项目中实际使用了10个核心API。
参考文档: