Flow 相关api的使用

16 阅读7分钟

Kotlin Flow API 完整列表

📚 目录

  1. Flow 创建操作符
  2. Flow 转换操作符
  3. Flow 过滤操作符
  4. Flow 组合操作符
  5. Flow 异常处理操作符
  6. Flow 生命周期操作符
  7. Flow 线程切换操作符
  8. Flow 终端操作符
  9. Flow 背压处理操作符
  10. 项目中实际使用的API
  11. [参考新项目] juejin.cn/post/722376…

Flow 创建操作符

1. flow { }项目中已使用

flow {
    emit(1)
    emit(2)
    emit(3)
}

用途: 创建冷流(Cold Flow),通过 emit() 发射数据
项目使用: lib_network/flow/FlowExt.ktlib_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.ktRegisterActivity.ktFlowExt.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.ktlib_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.ktlib_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.ktRegisterActivity.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.ktRegisterActivity.ktFlowExt.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.ktRegisterActivity.kt处理每个文本变化事件
debounce()LoginActivity.ktRegisterActivity.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个)

  1. flow { } - 创建Flow
  2. callbackFlow { } - 回调转Flow
  3. flowOn() - 线程切换
  4. onStart { } - 开始回调
  5. onCompletion { } - 完成回调
  6. catch { } - 异常捕获
  7. collect { } - 收集数据
  8. onEach { } - 处理每个元素
  9. debounce() - 防抖
  10. 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。


参考文档: