如何在Kotlin DSL中设置Rx Action Consumer

问题描述 投票:0回答:1

我正在研究用于Kotlin命令的RxKotlin DSL的开发

我有一些工作,但我会改进我设置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")

在设置ActionConsumer时,我想“改进”的代码是这个

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

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

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

例如我是否必须提及“Action {}”或者我是否可以使用“短手”版本来获得相同的结果?

kotlin dsl rx-kotlin2
1个回答
1
投票

你可以在DSL中定义这样的功能

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

可以像这样使用:

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

我希望不会有太多这些需要它

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

© www.soinside.com 2019 - 2024. All rights reserved.