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关键字,可以定义任意异步操作(网络请求,数据库操作等)如下:

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()
                }
        } 
复制代码

非常优雅有木有?!

具体操作(实现)

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

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

转载于:https://juejin.im/post/5cb94bd96fb9a0689d6f9ab5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值