欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Kotlin類型安全構建器的一次運用記錄

 更新時間:2020年06月26日 09:03:11   作者:mingdroid  
這篇文章主要給大家介紹了關于Kotlin類型安全構建器的一次運用,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Kotlin具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧

在android官方指導的相關應用框架中,用到一個Resource類來表示網絡請求的狀態(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)
}

大多數情況下我們在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() // 調用該接收者對象的一個方法
}

先分析下,我們需要的是一個實現了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類型安全構建器運用內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Android開發(fā)實現的電話竊聽和攔截應用

    Android開發(fā)實現的電話竊聽和攔截應用

    這篇文章主要介紹了Android開發(fā)實現的電話竊聽和攔截應用,結合實例形式分析了Android針對電話的監(jiān)聽與攔截的相關技巧,需要的朋友可以參考下
    2016-08-08
  • Android View 事件防抖的兩種方案

    Android View 事件防抖的兩種方案

    這篇文章主要介紹了Android View 事件防抖的兩種方案,幫助大家更好的理解和學習使用Android,感興趣的朋友可以了解下
    2021-04-04
  • android 實現側邊彈窗特效代碼

    android 實現側邊彈窗特效代碼

    側邊彈窗是在左邊,需要定位好位置,實現原理其實就是進出動效,用位移加透明度效果來控制,下面通過代碼給大家介紹android 實現側邊彈窗,需要的朋友參考下吧
    2021-06-06
  • Android進階Handler應用線上卡頓監(jiān)控詳解

    Android進階Handler應用線上卡頓監(jiān)控詳解

    這篇文章主要為大家介紹了Android進階Handler應用線上卡頓監(jiān)控詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • RecyclerView+SnapHelper實現無限循環(huán)篩選控件

    RecyclerView+SnapHelper實現無限循環(huán)篩選控件

    這篇文章主要為大家詳細介紹了RecyclerView+SnapHelper實現無限循環(huán)篩選控件,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • Android實現新浪微博一鍵分享的實例代碼

    Android實現新浪微博一鍵分享的實例代碼

    這篇文章主要介紹了Android實現新浪微博一鍵分享的實例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Android開發(fā)中requestfocus()無效的原因及解決辦法

    Android開發(fā)中requestfocus()無效的原因及解決辦法

    這篇文章主要介紹了Android開發(fā)中requestfocus()無效的原因及解決辦法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-08-08
  • Android?常見獲取設備標識方法總結

    Android?常見獲取設備標識方法總結

    隨著Android系統(tǒng)版本更新,Google對用戶隱私保護增強,限制獲取設備標識,文中測試DeviceID、ANDROID_ID、Serial、MAC地址等方法在不同API級別的表現,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • 使用VideoView播放App中的資源文件

    使用VideoView播放App中的資源文件

    這篇文章主要介紹了使用VideoView播放App中的資源文件,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • Android動態(tài)時鐘壁紙開發(fā)

    Android動態(tài)時鐘壁紙開發(fā)

    這篇文章主要為大家詳細介紹了Android動態(tài)時鐘壁紙開發(fā)的相關資料,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01

最新評論