使用流替换 RxJava 在 Kotlin 协程中单击侦听器

问题描述

我目前正在使用 rxjava,按钮单击事件的 rx 绑定,我想将其更改为使用 kotlin 协程流程。

请如何将此波纹管代码转换为使用 Flow

   @Override
    public Observable<Void> getStartFuellingObservable() {
        return RxView.clicks(dataViewHolder.btnStartFuelling);
    }

谢谢 R

解决方法

https://github.com/Kotlin-Android-Open-Source/MVI-Coroutines-Flow/blob/fa3a7d901a4a8e6b48be9b7474572f1b73e94bb8/core/src/main/java/com/hoc/flowmvi/core/FlowBinding%2BExts%2BUtils.kt#L77

@ExperimentalCoroutinesApi
@CheckResult
fun View.clicks(): Flow<View> {
  return callbackFlow {
    setOnClickListener { safeOffer(it) }
    awaitClose { setOnClickListener(null) }
  }
}
,

您可以构建一个简单的 Kotlin 扩展函数,如下所示:

fun View.clicks(): Flow<Unit> = callbackFlow {
    val listener = View.OnClickListener {
        offer(Unit)
    }
    setOnClickListener(listener)
    awaitClose { setOnClickListener(null) }
}

This article is the source

它包含有关如何拥有与 RxJava 类似的 API 及其 UI 绑定的更多信息。我认为你可以从那里受益