朋友們好,今天我向你們介紹下 ViewModel 中如何使用 ViewModelProvider.Factory.java
本文翻譯自:medium.com/koderlabs/v…ide
因此,咱們首要問題是:什麼是 ViewModelProvider.Factory ?讓咱們在不使用 ViewModelProvider.Factory 的狀況下,試着建立一個 ViewModel 看看:函數
在活動中實例化:測試
有沒有人注意到:當咱們使用 ViewModelProviders 在活動中實例化 MyViewModel 時,從未沒用過 MyViewModel 的構造方法,而都是使用 ViewModelProviders 這個類中的方法。ViewModelProviders 在內部爲咱們管理並調用 ViewModel 的主構造函數,建立viewmodel的實例並將該實例並返回。翻譯
那麼,如今讓咱們看看,若是咱們直接把參數傳遞給 MyViewModel 類的構造方法時會發生了什麼:3d
如今,咱們在活動中建立 MyViewModel 實例:cdn
太棒了!沒有發生任何錯誤對象
可是,等等。blog
當你運行上面這段代碼的時候,你收到了 RunTimeError。程序崩潰了!!! RuntimeException 不能建立出 MyViewModel 實例。接口
如今咱們爲何會發生這些。ViewModelProviders 的 of() 方法,在內部建立了默認的 ViewModelProvider.Factory ,從而實現了 ViewModel 的無參建立。因此,當咱們在構造方法添加參數時, ViewModelProvider.Factory 的內部沒法實例化 ViewModel 對象,由於 ViewModelProvider.Factory 調用主構造方法建立 ViewModel’s 實例而失敗。下圖是 ViewModelFactory ViewModelFactory 的默認實現。
若是你想在構造方法中添加參數,你須要編寫本身的 ViewModelProvider 來建立 ViewModel 實例。ViewModelProviders.Factory 接口是負責實例化 ViewModels 對象的啓動裝置。這意味着你須要本身寫實例化 ViewModel 對象的方法。
讓咱們像下面這樣建立本身的 ViewModelProvider.Factory :
這裏有幾點須要記下:
如今就讓咱們經過 ViewModelProvider.Factory 在活動中建立 ViewModel 實例。
咱們將參數或者依賴關係轉入咱們的 ViewModelProvider.Factory 以便於它可以爲咱們建立 ViewModel,ViewModelProviders.of( context, instanceOfViewModelFactory) 方法得到咱們 ViewModelProvider.Factory 實例,如今就像以前的例子中同樣,咱們已經學會了建立 ViewModel 實例的過程。
咱們心中有這樣一些疑問,咱們不能直接在活動或碎片中將值傳入 ViewModel 構造方法中去,我須要寫法來設置咱們的參數值使其正常工做,這就是爲何咱們須要 ViewModelProver.Factory,在一些狀況下你能夠不使用,但在某些特定情形下,你須要使用 ViewModelProver.Factory。
當你的 ViewModel 有依賴項,而且你須要將這些依賴項經過構造方法傳入,所以,您能夠模擬該依賴項並測試 ViewModel。
若是你的 ViewModel 沒有依賴項,這時你就不須要去本身建立 ViewModelProvider.Factory。系統自帶的方法,注意幫助你建立 ViewModel。
ViewModelProvider.Factory 負責幫你建立 ViewModel 實例。當你的 ViewModel 存在依賴項,且你但願測試你的 ViewModel 時,你須要建立本身的 ViewModelProvider.Factory 來經過 ViewModel 的構造方法傳遞依賴項,將你的數值傳入 ViewModelProvider.Factory 實例中去
你的關注是我最大的動力!