我想让挡路的void enqueue(Callback<T> callback);个方法调用代码更有表现力,下面是我通常有的一个

request.enqueue(object : Callback<MyModel> {
      override fun onFailure(call: Call<MyModel>?, t: Throwable?) {
           //
      }

      override fun onResponse(call: Call<MyModel>?, response: Response<MyModel>?) {
           //
      }
 })

我想要的和意思是,以更干净的方式更改这个代码块,删除这override, object, Callback个关键字,然后做一些类似的事情:

request.enqueue({throwable, response -> })

我认为它可以通过扩展和高阶函数进行改进.有人知道怎么做吗?

推荐答案

这就是我如何使用扩展函数和类来实现这一点

fun<T> Call<T>.enqueue(callback: CallBackKt<T>.() -> Unit) {
    val callBackKt = CallBackKt<T>()
    callback.invoke(callBackKt)
    this.enqueue(callBackKt)
}

class CallBackKt<T>: Callback<T> {

    var onResponse: ((Response<T>) -> Unit)? = null
    var onFailure: ((t: Throwable?) -> Unit)? = null

    override fun onFailure(call: Call<T>, t: Throwable) {
        onFailure?.invoke(t)
    }

    override fun onResponse(call: Call<T>, response: Response<T>) {
        onResponse?.invoke(response)
    }

}

then you can use it like this

request.enqueue {

    onResponse = {
        // do
    }

    onFailure = {
        // do
    }

}

Kotlin相关问答推荐

在没有外部 map 的情况下转换列表项

如何在Jetpack Compose中的列中渲染图像

捕捉异常是Kotlin协程中的反模式吗?

为何Kotlin标准库中的AND和OR函数不能像&&和||一样进行短路运算?

有什么方法可以要求在 kotlin 中的类型参数上进行注释?

如何规避 Kotlin 的泛型类型差异约束

具有泛型类型的 Kotlin 密封接口不会为其子类型推断约束

如何在 kotlin 中使用带有泛型的密封类

为什么 Kotlin 在 sumOf 函数 lambda 中默认不将数字视为Int?

使用 LazyListScope 嵌套可组合项

正则表达式 FindAll 不打印结果 Kotlin

添加 Kapt 插件后 - 执行 org.jetbrains.kotlin.gradle.internal.KaptExecution 时发生故障

无法从 XML 访问 NavHostFragment

Kotlin 中的 Java Scanner 相当于什么?

Foo::class.java 和 Foo::javaClass 有什么区别?

作为 Kotlin 中的函数的结果,如何从 Firestore 数据库返回列表?

Kotlin val difference getter override vs assignment

如何在Kotlin中使用ViewModelProviders

Kotlin - computed var 属性的用处?

如何修复未解析的参考生命周期范围?