时间:2021-05-20
在android官方指导的相关应用框架中,用到一个Resource类来表示网络请求的状态与结果
// A generic class that contains data and status about loading this data.sealed class Resource<T>( val data: T? = null, val message: String? = null) { class Success<T>(data: T) : Resource<T>(data) class Loading<T>(data: T? = null) : Resource<T>(data) class Error<T>(message: String, data: T? = null) : Resource<T>(data, message)}大多数情况下我们在activity里面是这样用的
private val testViewModel : TestViewModel by viewModels()private fun getUserInfo(uid: String) { testViewModel.userInfoData.observe(this, Observer { when (it.status) { Status.SUCCESS -> TODO() Status.ERROR -> TODO() Status.LOADING -> TODO() } }) testViewModel.setUserId(uid)}这样写多了感觉好烦,每次都是when(),有没有更爽的写法呢?比如这样?
private fun getUserInfo(uid: String) { testViewModel.userInfoData.observe(this, Observer { success { } error { } loading { } }) testViewModel.setUserId(uid)}当我只需要处理success的时候,我可以不写error/loading情况。
kotlin的类型安全构建器可以做到,我们先看下官方的示例
class HTML { fun body() { …… }}fun html(init: HTML.() -> Unit): HTML { val html = HTML() // 创建接收者对象 html.init() // 将该接收者对象传给该 lambda return html}html { // 带接收者的 lambda 由此开始 body() // 调用该接收者对象的一个方法}先分析下,我们需要的是一个实现了Observer接口的对象。
所以我们先定义一个类来实现Observer接口
class ResourceObserver<T: Any> : Observer<Resource<T>> { override fun onChanged(t: Resource<T>) { when(t) { is Resource.Success -> TODO() is Resource.Error -> TODO() is Resource.Loading -> TODO() } }}实现一个顶层函数,返回一个ResourceObserver对象
fun <T: Any> resourceObserver(init: ResourceObserver<T>.() -> Unit): ResourceObserver<T> { val observer = ResourceObserver<T>() observer.init() return observer }调用该函数即可得到ResourceObserver对象
resourceObserver { //在此处可以调用对象内的成员函数}所以我的实现是
class ResourceObserver<T: Any> : Observer<Resource<T>> { private var success: (Resource.Success<T>.() -> Unit)? = null private var error: (Resource.Error.() -> Unit)? = null private var loading: (Resource.Loading<T>.() -> Unit)? = null fun success(s: (Resource.Success<T>.() -> Unit)) { success = s } fun error(e: Resource.Error.() -> Unit) { error = e } fun loading(l: Resource.Loading<T>.() -> Unit) { loading = l } override fun onChanged(t: Resource<T>) { when(t) { is Resource.Success -> success?.invoke(t) is Resource.Error -> error?.invoke(t) is Resource.Loading -> loading?.invoke(t) } }}总结
到此这篇关于Kotlin类型安全构建器的一次运用记录的文章就介绍到这了,更多相关Kotlin类型安全构建器运用内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
iOS或者其他系统,都是为了搞定之前手机运用过程中的漏洞。手机系统的每一次升级,性能的每一次提升都是对手机安全、运用操作的提升。 2、提供更多功能,优化手机运
问题步骤记录器是什么? 当问题步骤记录器开始录制后,打开目标程序,在操作过程中,您每点击一次鼠标,记录器就会做一次截屏,并以图片和文字形式保存下来,重点的地方
问题步骤记录器是什么? 当问题步骤记录器开始录制后,打开目标程序,在操作过程中,您每点击一次鼠标,记录器就会做一次截屏,并以图片和文字形式保存下来,重点的地方
最近第一次使用vue-cli构建项目,第一次打包部署到服务器上的时候出现图片加载不出来,结合网上的方法,终于给摸索出来。将项目部署到服务器上分为两种:一种是直接
在JS中有些内存只需执行一遍即可,如浏览器类型检测是最常用的一个功能,因为我们使用Ajax的时候需要检测浏览器的内置的XHR。我们可以在第一次检测的时候记录下类