接上篇,BaseViewModel類通過泛型 與?BaseViewEvent類關聯起來,貌似不錯。實際開發中,限制實在太多了。乃至簡單頁面也要如此繁瑣。因此去掉泛型限制。改成子類重寫?getEvent 的方式賦值。
如圖,BaseViewModel 沒有其他作用,僅僅是與BaseViewEvent 關聯而已。
這么做的思路是為了方便 xml 的控件可以通過 viewModel.viewEvent:xxxx 調用相關事件。
BaseViewEvent 基本上沒有改動。只要是新增的控件事件,都需往這里添加空的方法。子類重寫即可使用。
BaseVMActivity 的主要作用是,將根據 xml 自動生成的 Binding 類與BaseViewModel類,BaseViewEvent類 進行關聯。
需要注意的是圖2,通過泛型與反射做了Binding 類與BaseViewModel類,BaseViewEvent關聯操作。省去子類的各種重復代碼。
到這里,還是很虛是吧。一般情況,一個父類基本上就完成了大部分工作。而這里更多都是基本的整理。上不了臺面。主要的想法是不太想整在一起,將 底層mvvm?跟業務扯上關系。
接下來就是更上層的封裝,而項目的開發也是基于這一層。
BaseAppViewModel :繼承于 BaseViewModel
對于 ViewModel 的理解見仁見智。
截圖可以看出,這里將網絡請求也集成進來。原因是,后續子類就可以直接調用網絡請求方法。更加簡單便捷。如下圖:(異步實現依然是 Kotlin 的協程。)
除此之外,ViewModel 盡可能的關心數據。對此,第一個問題來了。怎么處理 loading 對話框以及 toast。
這里定義
var loadingStyle = MutableLiveData<LoadingStyleData>()
var toast = MutableLiveData<String>()
分別對 loading, toast 進行觀察。當數據變化時,便更新UI(彈出/消失 loading,toast)
BaseAppActivity :繼承于 BaseVMActivity
這里需要注意的是:
圖1中,需要設置主題。不然,會奔潰。
圖2中,就是觀察 BaseAppViewModel 里的 loadingStyle 與?toast, 從而實現顯示,消失loading,? toast。
圖3中,由于應用里,幾乎都是統一的標題。采用 include 方式引入統一 xml 布局。由于非強制,這里做了判空。當然,也可以重寫該方法綁定其他 xml 布局。
這里還需注意?initVMObserve 方法,但子類activity 需要關注 專屬LiveData 時可重寫該方法。如下圖:
有了 BaseAppViewModel,?BaseAppActivity ,基本就可以開展業務開發了。
本篇暫時就到這里哈。