Kotlin類型安全構(gòu)建器的一次運(yùn)用記錄
在android官方指導(dǎo)的相關(guān)應(yīng)用框架中,用到一個(gè)Resource類來(lái)表示網(wǎng)絡(luò)請(qǐng)求的狀態(tài)與結(jié)果
// 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)
}
大多數(shù)情況下我們?cè)赼ctivity里面是這樣用的
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)
}
當(dāng)我只需要處理success的時(shí)候,我可以不寫error/loading情況。
kotlin的類型安全構(gòu)建器可以做到,我們先看下官方的示例
class HTML {
fun body() { …… }
}
fun html(init: HTML.() -> Unit): HTML {
val html = HTML() // 創(chuàng)建接收者對(duì)象
html.init() // 將該接收者對(duì)象傳給該 lambda
return html
}
html { // 帶接收者的 lambda 由此開始
body() // 調(diào)用該接收者對(duì)象的一個(gè)方法
}
先分析下,我們需要的是一個(gè)實(shí)現(xiàn)了Observer接口的對(duì)象。
所以我們先定義一個(gè)類來(lái)實(shí)現(xiàn)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()
}
}
}
實(shí)現(xiàn)一個(gè)頂層函數(shù),返回一個(gè)ResourceObserver對(duì)象
fun <T: Any> resourceObserver(init: ResourceObserver<T>.() -> Unit): ResourceObserver<T> {
val observer = ResourceObserver<T>()
observer.init()
return observer
}
調(diào)用該函數(shù)即可得到ResourceObserver對(duì)象
resourceObserver {
//在此處可以調(diào)用對(duì)象內(nèi)的成員函數(shù)
}
所以我的實(shí)現(xiàn)是
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)
}
}
}
總結(jié)
到此這篇關(guān)于Kotlin類型安全構(gòu)建器的一次運(yùn)用記錄的文章就介紹到這了,更多相關(guān)Kotlin類型安全構(gòu)建器運(yùn)用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
2013年 移動(dòng)App設(shè)計(jì)13項(xiàng)注意細(xì)節(jié)總結(jié)
在過去的一年里,移動(dòng)成主流也讓眾多的移動(dòng)應(yīng)用如雨后春筍般層出不窮,在眾多開發(fā)者從中獲利的同時(shí)競(jìng)爭(zhēng)也愈演愈烈,如何才能保證自己立于不敗之地接下來(lái)介紹移動(dòng)App設(shè)計(jì)的13大精髓感興趣的朋友可以了解下啊2013-01-01
Android編程實(shí)現(xiàn)仿優(yōu)酷旋轉(zhuǎn)菜單效果(附demo源碼)
這篇文章主要介紹了Android編程實(shí)現(xiàn)仿優(yōu)酷旋轉(zhuǎn)菜單效果的方法,較為詳細(xì)的分析了Android實(shí)現(xiàn)旋轉(zhuǎn)菜單的布局與功能實(shí)現(xiàn)技巧,并附帶完整的demo源碼供讀者下載參考,需要的朋友可以參考下2015-12-12
Android自定義View播放Gif動(dòng)畫的示例
本篇文章主要介紹了Android自定義View播放Gif動(dòng)畫的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2017-10-10
Android studio報(bào)錯(cuò):The emulator process for AVD (xxx) was kill
這篇文章主要介紹了Android studio報(bào)錯(cuò):The emulator process for AVD (xxx) was killed,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
Android百度地圖實(shí)現(xiàn)搜索和定位及自定義圖標(biāo)繪制并點(diǎn)擊時(shí)彈出泡泡
這篇文章主要介紹了Android百度地圖實(shí)現(xiàn)搜索和定位及自定義圖標(biāo)繪制并點(diǎn)擊時(shí)彈出泡泡的相關(guān)資料,需要的朋友可以參考下2016-01-01
Android中TabLayout+ViewPager實(shí)現(xiàn)tab和頁(yè)面聯(lián)動(dòng)效果
本篇文章主要介紹了Android中TabLayout+ViewPager實(shí)現(xiàn)tab和頁(yè)面聯(lián)動(dòng)效果,具有一定的參考價(jià)值,有興趣的可以了解一下2017-06-06
Android 中倒計(jì)時(shí)驗(yàn)證兩種常用方式實(shí)例詳解
這篇文章主要介紹了Android 中倒計(jì)時(shí)驗(yàn)證兩種常用方式實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06

