android - 使用 Retrofit 方法更具表现力

我想做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)
    }

}

那么你可以这样使用它

request.enqueue {

    onResponse = {
        // do
    }

    onFailure = {
        // do
    }

}

https://stackoverflow.com/questions/43233025/

相关文章:

kotlin - 在 Kotlin 中复制 map 最聪明的方法是什么?

kotlin - 如何在 Kotlin 中定义非序数枚举?

android - 在 Kotlin 中的原始类型属性上不允许使用 lateinit 修饰符

android - Kotlin 等价于 Java 的 equalsIgnoreCase

kotlin - 为什么这个 Kotlin 方法有封闭的反引号?

android - 无法获取提供商 com.google.android.gms.ads.Mobil

android - 在 android studio 中运行带有 main 函数的单个 kotlin

kotlin - 传递 null 时,有没有办法在非可选参数上使用默认值?

android - Dagger 2 与 Kotlin 的多重绑定(bind)

android - 如何在 Kotlin 中获取当前的本地日期和时间