KMP实现commonFlow构建器 适配iOS端CommonFlow调用
Kotlin Multiplatform 中commonFlow顶层构建器实现方案
核心实现
直接复用Kotlin协程原生flow{}构建器的能力,将构建出的原生Flow通过已有的asCommonFlow()扩展包装为CommonFlow返回即可,不需要重新实现流的收集、发射逻辑,完全兼容原生Flow的背压、异常传播、协程取消等所有核心特性:
import kotlinx.coroutines.flow.FlowCollector import kotlinx.coroutines.flow.flow /** * 同原生flow{}构建器用法完全一致,直接返回CommonFlow实例供iOS端直接调用listen方法订阅 */ fun <T> commonFlow(block: suspend FlowCollector<T>.() -> Unit): CommonFlow<T> { return flow(block).asCommonFlow() }
业务代码使用方式
替换原有业务代码中的flow{}为commonFlow{}即可,返回值直接为CommonFlow类型,不需要额外手动调用asCommonFlow()转换:
class HelpRepository : BaseRepository() { fun test(request: AddFeedBackRequest) = commonFlow { val feedBackType = if (request.type == AddFeedBackType.Bug) { FeedbackType.BUG } else { FeedbackType.FEEDBACK } val input = AddFeedbackInput(request.note, Optional.presentIfNotNull(feedBackType)) emit(true) val mutation = AddFeedbackMutation(input) val response = executeMutation(mutation) emit(false) } }
扩展适配其他流构建场景
如果需要将其他原生Flow构建器也适配为返回CommonFlow类型,实现逻辑完全一致,直接包装对应原生构建器的返回值即可:
import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.ProducerScope // 适配固定值流构建 fun <T> commonFlowOf(vararg values: T): CommonFlow<T> = flowOf(*values).asCommonFlow() // 适配回调转流场景 fun <T> commonCallbackFlow(block: suspend ProducerScope<T>.() -> Unit): CommonFlow<T> = callbackFlow(block).asCommonFlow() // 适配空流场景 fun <T> emptyCommonFlow(): CommonFlow<T> = emptyFlow<T>().asCommonFlow()
注意事项
- CommonFlow类通过类委托实现了原生Flow接口,所有原生Flow的操作符(
map、filter、flowOn、catch、onStart等)都可以正常链式调用,注意经过操作符处理后返回的是原生Flow类型,如果最终需要暴露给iOS端使用,在调用链末尾追加一次.asCommonFlow()转换即可。 - 原有CommonFlow的
listen方法中硬编码了Dispatchers.Main调度器,如果需要支持自定义订阅调度器,可以给listen方法增加可选的CoroutineContext参数,按需传入即可。
内容的提问来源于stack exchange,提问作者ALKIN ÇAKIRALAR
相关产品推荐
相关产品推荐

