Kotlin類型安全構(gòu)建器的一次運(yùn)用記錄
在android官方指導(dǎo)的相關(guān)應(yīng)用框架中,用到一個(gè)Resource類來表示網(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è)類來實(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)文章
Android開發(fā)實(shí)現(xiàn)的電話竊聽和攔截應(yīng)用
這篇文章主要介紹了Android開發(fā)實(shí)現(xiàn)的電話竊聽和攔截應(yīng)用,結(jié)合實(shí)例形式分析了Android針對(duì)電話的監(jiān)聽與攔截的相關(guān)技巧,需要的朋友可以參考下2016-08-08android 實(shí)現(xiàn)側(cè)邊彈窗特效代碼
側(cè)邊彈窗是在左邊,需要定位好位置,實(shí)現(xiàn)原理其實(shí)就是進(jìn)出動(dòng)效,用位移加透明度效果來控制,下面通過代碼給大家介紹android 實(shí)現(xiàn)側(cè)邊彈窗,需要的朋友參考下吧2021-06-06Android進(jìn)階Handler應(yīng)用線上卡頓監(jiān)控詳解
這篇文章主要為大家介紹了Android進(jìn)階Handler應(yīng)用線上卡頓監(jiān)控詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01RecyclerView+SnapHelper實(shí)現(xiàn)無限循環(huán)篩選控件
這篇文章主要為大家詳細(xì)介紹了RecyclerView+SnapHelper實(shí)現(xiàn)無限循環(huán)篩選控件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10Android實(shí)現(xiàn)新浪微博一鍵分享的實(shí)例代碼
這篇文章主要介紹了Android實(shí)現(xiàn)新浪微博一鍵分享的實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07Android開發(fā)中requestfocus()無效的原因及解決辦法
這篇文章主要介紹了Android開發(fā)中requestfocus()無效的原因及解決辦法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08Android?常見獲取設(shè)備標(biāo)識(shí)方法總結(jié)
隨著Android系統(tǒng)版本更新,Google對(duì)用戶隱私保護(hù)增強(qiáng),限制獲取設(shè)備標(biāo)識(shí),文中測試DeviceID、ANDROID_ID、Serial、MAC地址等方法在不同API級(jí)別的表現(xiàn),感興趣的朋友跟隨小編一起看看吧2024-09-09Android動(dòng)態(tài)時(shí)鐘壁紙開發(fā)
這篇文章主要為大家詳細(xì)介紹了Android動(dòng)態(tài)時(shí)鐘壁紙開發(fā)的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01