首页 > 解决方案 > 如何在 Kotlin DSL 中设置 Rx Action Consumer

问题描述

我正在研究开发用于命令的KotlinDSLRxKotlin

我有一些工作,但是我会改进设置 Rx Action(s) 和Consumer(s) 的方法。

我目前拥有的代码类似于:-

@SequenceDsl
class ExperimentalBuilder {

    companion object {
        private val emptyAction = Action { }
        private val emptyConsumer: Consumer<in Throwable> = Consumer { }
    }


    var uuid: String = ""
    var onError: Consumer<in Throwable> = emptyConsumer
    var onComplete: Action = emptyAction
    var doFinally: Action = emptyAction
    var doLoginRefreshFail: Action = emptyAction

    fun build(): Experimental = Experimental(uuid, onError, onComplete, doFinally, doLoginRefreshFail)

}

import io.reactivex.Single
import io.reactivex.functions.Action
import io.reactivex.functions.Consumer
import io.reactivex.schedulers.Schedulers

data class Experimental(
    val uuid: String,
    val onError: Consumer<in Throwable>,
    val onComplete: Action,
    val doFinally: Action,
    val doLoginRefreshFail: Action
) : Morpheme() {

    override fun execute() {

        Single.just("")
            .subscribeOn(Schedulers.single())
            .ignoreElement()
            .doOnSubscribe {disposable -> COMPOSITE_DISPOSABLE.add(disposable) }
            .doOnComplete(onComplete)
            .doOnError(onError)
            .doFinally(doFinally)
            .doAfterTerminate(doAfterTerminate())
            .subscribe()
    }
}

我使用此代码如下: -

  val experimental = Dsl().experimental {
            uuid = "09876"

            onComplete = Action {
                Log.d("EXPERIMENT", "ON COMPLETE")
                Log.d("EXPERIMENT", "ON COMPLETE")
            }

            onError = Consumer {
                    throwable -> Log.e("EXPERIMENT", "ON ERROR", throwable)
            }

            doFinally =  Action {
                Log.d("EXPERIMENT", "DO FINALLY")
            }

            doLoginRefreshFail =  Action {
                Log.d("EXPERIMENT", "DO LOGIN REFRESH FAIL")
            }
        }

        experimental.execute()

        Log.d("DSL", "what $experimental")

我想“改进”的代码是在设置Action或时Consumer

  onComplete = Action {
    Log.d("EXPERIMENT", "ON COMPLETE")
    Log.d("EXPERIMENT", "ON COMPLETE")
  }

  onError = Consumer {
    throwable -> Log.e("EXPERIMENT", "ON ERROR", throwable)
  }

这是我可以用来设置“onCompile”操作的唯一方法吗?

例如,我必须提及“Action {}”还是有一个“速记”版本我可以使用来达到相同的结果?

标签: kotlindslrx-kotlin2

解决方案


你可以在 DSL 中定义这样的函数

fun onComplete(onCompleteCallback: ()->Unit) {
  onComplete = Action(onCompleteCallback)
}

可以这样使用:

onComplete {
    Log.d("EXPERIMENT", "ON COMPLETE")
    Log.d("EXPERIMENT", "ON COMPLETE")
}

我希望不会有太多需要它的人

通常 kotlin 可以帮助进行 SAM 转换,但这似乎只真正适用于函数调用,而不是直接设置它时,一旦你可以定义一个函数,你最好确保包装正确完成也考虑制作这些函数inline


推荐阅读