Kotlin類型安全構建器的一次運用記錄
在android官方指導的相關應用框架中,用到一個Resource類來表示網(wǎng)絡請求的狀態(tài)與結果
// 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ù)情況下我們在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() // 創(chuàng)建接收者對象
html.init() // 將該接收者對象傳給該 lambda
return html
}
html { // 帶接收者的 lambda 由此開始
body() // 調用該接收者對象的一個方法
}
先分析下,我們需要的是一個實現(xiàn)了Observer接口的對象。
所以我們先定義一個類來實現(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()
}
}
}
實現(xiàn)一個頂層函數(shù),返回一個ResourceObserver對象
fun <T: Any> resourceObserver(init: ResourceObserver<T>.() -> Unit): ResourceObserver<T> {
val observer = ResourceObserver<T>()
observer.init()
return observer
}
調用該函數(shù)即可得到ResourceObserver對象
resourceObserver {
//在此處可以調用對象內的成員函數(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)
}
}
}
總結
到此這篇關于Kotlin類型安全構建器的一次運用記錄的文章就介紹到這了,更多相關Kotlin類型安全構建器運用內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Android開發(fā)實現(xiàn)的電話竊聽和攔截應用
這篇文章主要介紹了Android開發(fā)實現(xiàn)的電話竊聽和攔截應用,結合實例形式分析了Android針對電話的監(jiān)聽與攔截的相關技巧,需要的朋友可以參考下2016-08-08
Android進階Handler應用線上卡頓監(jiān)控詳解
這篇文章主要為大家介紹了Android進階Handler應用線上卡頓監(jiān)控詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-01-01
RecyclerView+SnapHelper實現(xiàn)無限循環(huán)篩選控件
這篇文章主要為大家詳細介紹了RecyclerView+SnapHelper實現(xiàn)無限循環(huán)篩選控件,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-10-10
Android開發(fā)中requestfocus()無效的原因及解決辦法
這篇文章主要介紹了Android開發(fā)中requestfocus()無效的原因及解決辦法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-08-08

