Kotlin DSL 实战

目标数据库

首先,定义好异步结果泛化类型AsyncResult,此处会用到Kotlin泛型编程基础知识:编程

sealed class AsyncResult<out T : Any>

data class AsyncSuccess<out T : Any>(val data: T?) : AsyncResult<T>()

data class AsyncError(val error: String?) : AsyncResult<Nothing>()

inline fun <T : Any> AsyncResult<T>.onSuccess(action: (T?) -> Unit): AsyncResult<T> {
    if (this is AsyncSuccess) action(data)
    return this
}

inline fun <T : Any> AsyncResult<T>.onError(action: (String) -> Unit) {
    if (this is AsyncError && error != null) action(error)
}
复制代码

基于此AsyncResult和Kotlin协程suspend关键字,能够定义任意异步操做(网络请求,数据库操做等)以下:bash

suspend fun demoAction(): AsyncResult<List<DemoItem>> {
    //请暂时忽略实现方法
  }
复制代码

接下来好戏登场,UI部分的代码:网络

launch {
            demoAction()
                .onSuccess {
                    Toast.makeText(this@MainActivity, "Successfully Fetched ${it?.size} Items", Toast.LENGTH_LONG)
                        .show()
                }

                .onError {
                    Toast.makeText(this@MainActivity, "Failed!! -- $it", Toast.LENGTH_LONG).show()
                }
        } 
复制代码

很是优雅有木有?!异步

具体操做(实现)函数

展现过了魔术效果, 咱们来揭秘下几处关键手法:ui

  • sealed class 描述了受限的类继承结构,即限定了此类实例只能是有限的几种类型。 AsyncSuccess和AsyncError则是AsyncResult的派生类而已。
  • onSuccess和oError是AsyncResult的扩展方法(Kotlin能够给已知的任何 class 类添加函数), 其中onSuccess还返回了自身对象,以便链式调用。
  • onSuccess和onError均接受惟一一个Lambda参数, 从而能够实现形式上onSuccess{}.onError{}的写法。
相关文章
相关标签/搜索