【奇技淫巧】巧用 kotlin 擴展函數和 typealias 封裝 帶網絡狀態和解決「粘性」事件的 LiveData

關於 LiveData 兩個經常使用的姿式

使用包裝類傳遞事件

咱們在使用 LiveData 時可能會遇到「粘性」事件的問題,該問題可使用包裝類的方式解決。解決方案見 [譯] 在 SnackBar,Navigation 和其餘事件中使用 LiveData(SingleLiveEvent 案例)java

使用時是這樣的git

class ListViewModel : ViewModel {
 private val _navigateToDetails = MutableLiveData<Event<String>>()   val navigateToDetails : LiveData<Event<String>>  get() = _navigateToDetails    fun userClicksOnButton(itemId: String) {  _navigateToDetails.value = Event(itemId) // Trigger the event by setting a new Event as a new value  } }  myViewModel.navigateToDetails.observe(this, Observer {  it.getContentIfNotHandled()?.let { // Only proceed if the event has never been handled  startActivity(DetailsActivity...)  } }) 複製代碼

不過這樣寫甚是繁瑣,咱們可使用更優雅的方式解決該問題github

//爲 LiveData<Event<T>>提供類型別名,使用 EventLiveData<T> 便可
typealias EventMutableLiveData<T> = MutableLiveData<Event<T>>  typealias EventLiveData<T> = LiveData<Event<T>> 複製代碼

使用 typealias 關鍵字,咱們能夠提供一個類型別名,能夠這樣使用web

//等價於 MutableLiveData<Event<Boolean>>(Event(false))
val eventContent = EventMutableLiveData<Boolean>(Event(false)) 複製代碼

如今聲明時不用多加一層泛型了,那麼使用時仍是很繁瑣網絡

咱們能夠藉助 kotlin 的 擴展函數更優雅的使用app

event 擴展函數
event 擴展函數
使用
使用

demo 中封裝了兩種形式的 LiveData,一種爲 LiveData<Boolean>,一種爲 EventLiveData<Boolean>,當屏幕旋轉時,前者會再次回調結果,然後者因爲事件已被處理而不執行 onChanged,咱們經過 Toast 可觀察到這一現象編輯器

java 版的可參考模塊化

封裝帶網絡狀態的數據

不少時候咱們在獲取網絡數據時要封裝一層網絡狀態,例如:加載中,成功,失敗函數

在使用時咱們遇到了和上面同樣的問題,多層泛型用起來很麻煩組件化

咱們依然可使用 typealias + 擴展函數來優雅的處理該問題

typealias
typealias
擴展函數
擴展函數
使用
使用

demo 截圖

demo
demo

Demo

demo 在這

往期文章

該系列主要介紹一些「騷操做」,它未必適合生產環境使用,可是是一些比較新穎的思路

個人其餘系列文章 在這裏

關於我

我是 Fly_with24

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息