ViewModel 和 ViewModelProvider.Factory:ViewModel 的建立者

朋友們好,今天我向你們介紹下 ViewModel 中如何使用 ViewModelProvider.Factory.java

本文翻譯自:medium.com/koderlabs/v…ide


如今開始

因此,咱們首要問題是:什麼是 ViewModelProvider.Factory ?讓咱們在不使用 ViewModelProvider.Factory 的狀況下,試着建立一個 ViewModel 看看:函數

MyViewModel.kt

在活動中實例化:測試

MyActivity.kt

有沒有人注意到:當咱們使用 ViewModelProviders 在活動中實例化 MyViewModel 時,從未沒用過 MyViewModel 的構造方法,而都是使用 ViewModelProviders 這個類中的方法。ViewModelProviders 在內部爲咱們管理並調用 ViewModel 的主構造函數,建立viewmodel的實例並將該實例並返回。翻譯

那麼,如今讓咱們看看,若是咱們直接把參數傳遞給 MyViewModel 類的構造方法時會發生了什麼:3d

MyViewModel.kt

如今,咱們在活動中建立 MyViewModel 實例:cdn

MyActivity.kt

太棒了!沒有發生任何錯誤對象

可是,等等。blog

當你運行上面這段代碼的時候,你收到了 RunTimeError。程序崩潰了!!! RuntimeException 不能建立出 MyViewModel 實例。接口

如今咱們爲何會發生這些。ViewModelProviders 的 of() 方法,在內部建立了默認的 ViewModelProvider.Factory ,從而實現了 ViewModel 的無參建立。因此,當咱們在構造方法添加參數時, ViewModelProvider.Factory 的內部沒法實例化 ViewModel 對象,由於 ViewModelProvider.Factory 調用主構造方法建立 ViewModel’s 實例而失敗。下圖是 ViewModelFactory ViewModelFactory 的默認實現。

ViewModel Factory inner implementation
若是你想在構造方法中添加參數,你須要編寫本身的 ViewModelProvider 來建立 ViewModel 實例。

什麼是 ViewModelProvider.Factory?

ViewModelProviders.Factory 接口是負責實例化 ViewModels 對象的啓動裝置。這意味着你須要本身寫實例化 ViewModel 對象的方法。

讓咱們像下面這樣建立本身的 ViewModelProvider.Factory :

MyViewModelFactory.kt

這裏有幾點須要記下:

  1. 你須要經過構造方法或者其餘你喜歡的途徑(好比 Singleton, FactoryPattern 等等)。這是因爲你在實例化 ViewModel 對象時,不能直接在活動或者碎片中調用 ViewModel 的構造方法,並且你又想去設置 ViewModel 構造方法的參數,所以你須要將參數傳入 ViewModelProvider.Factory 它將會幫你建立你的 ViewModel。
  2. ViewModelProvider.Factory 是一個包含 create 方法的接口。這個 create 方法負責建立你的 VeiwModel’s 實例。
  3. modelClass.getConstructor(Int::class.java) 方法是一個整型的可以經過調用 newInstance 方法來想構造方法傳值的方法。

如今就讓咱們經過 ViewModelProvider.Factory 在活動中建立 ViewModel 實例。

MyActivity.kt

咱們將參數或者依賴關係轉入咱們的 ViewModelProvider.Factory 以便於它可以爲咱們建立 ViewModel,ViewModelProviders.of( context, instanceOfViewModelFactory) 方法得到咱們 ViewModelProvider.Factory 實例,如今就像以前的例子中同樣,咱們已經學會了建立 ViewModel 實例的過程。

因此,爲何咱們須要 ViewModelProvider.Factory ?

咱們心中有這樣一些疑問,咱們不能直接在活動或碎片中將值傳入 ViewModel 構造方法中去,我須要寫法來設置咱們的參數值使其正常工做,這就是爲何咱們須要 ViewModelProver.Factory,在一些狀況下你能夠不使用,但在某些特定情形下,你須要使用 ViewModelProver.Factory。

何時使用 ViewModelProvider.Factory

當你的 ViewModel 有依賴項,而且你須要將這些依賴項經過構造方法傳入,所以,您能夠模擬該依賴項並測試 ViewModel。

何時不該該使用 ViewModelProvider.Factory

若是你的 ViewModel 沒有依賴項,這時你就不須要去本身建立 ViewModelProvider.Factory。系統自帶的方法,注意幫助你建立 ViewModel。

總結

ViewModelProvider.Factory 負責幫你建立 ViewModel 實例。當你的 ViewModel 存在依賴項,且你但願測試你的 ViewModel 時,你須要建立本身的 ViewModelProvider.Factory 來經過 ViewModel 的構造方法傳遞依賴項,將你的數值傳入 ViewModelProvider.Factory 實例中去

你的關注是我最大的動力!

相關文章
相關標籤/搜索