咱們在使用 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
demo 中封裝了兩種形式的 LiveData,一種爲 LiveData<Boolean>
,一種爲 EventLiveData<Boolean>
,當屏幕旋轉時,前者會再次回調結果,然後者因爲事件已被處理而不執行 onChanged,咱們經過 Toast 可觀察到這一現象編輯器
java 版的可參考模塊化
不少時候咱們在獲取網絡數據時要封裝一層網絡狀態,例如:加載中,成功,失敗函數
在使用時咱們遇到了和上面同樣的問題,多層泛型用起來很麻煩組件化
咱們依然可使用 typealias + 擴展函數來優雅的處理該問題
demo 截圖
demo 在這
該系列主要介紹一些「騷操做」,它未必適合生產環境使用,可是是一些比較新穎的思路
個人其餘系列文章 在這裏
我是 Fly_with24