MVVM(封裝一)

接上篇,BaseViewModel類通過泛型 與?BaseViewEvent類關聯起來,貌似不錯。實際開發中,限制實在太多了。乃至簡單頁面也要如此繁瑣。因此去掉泛型限制。改成子類重寫?getEvent 的方式賦值。

如圖,BaseViewModel 沒有其他作用,僅僅是與BaseViewEvent 關聯而已。

這么做的思路是為了方便 xml 的控件可以通過 viewModel.viewEvent:xxxx 調用相關事件。


BaseViewEvent 基本上沒有改動。只要是新增的控件事件,都需往這里添加空的方法。子類重寫即可使用。

BaseVMActivity 的主要作用是,將根據 xml 自動生成的 Binding 類與BaseViewModel類,BaseViewEvent類 進行關聯。

圖1
圖2
圖3

需要注意的是圖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
圖3

這里需要注意的是:

圖1中,需要設置主題。不然,會奔潰。

圖2中,就是觀察 BaseAppViewModel 里的 loadingStyle 與?toast, 從而實現顯示,消失loading,? toast。

圖3中,由于應用里,幾乎都是統一的標題。采用 include 方式引入統一 xml 布局。由于非強制,這里做了判空。當然,也可以重寫該方法綁定其他 xml 布局。

這里還需注意?initVMObserve 方法,但子類activity 需要關注 專屬LiveData 時可重寫該方法。如下圖:

有了 BaseAppViewModel,?BaseAppActivity ,基本就可以開展業務開發了。

本篇暫時就到這里哈。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。