朋友們好,今天我向大家介紹下 ViewModel 中如何使用 ViewModelProvider.Factory.
現在開始
所以,我們首要問題是:什么是 ViewModelProvider.Factory ?讓我們在不使用 ViewModelProvider.Factory 的情況下,試着創建一個 ViewModel 看看:
在活動中實例化:
有沒有人注意到:當我們使用 ViewModelProviders 在活動中實例化 MyViewModel 時,從未沒用過 MyViewModel 的構造方法,而都是使用 ViewModelProviders 這個類中的方法。ViewModelProviders 在內部為我們管理並調用 ViewModel 的主構造函數,創建viewmodel的實例並將該實例並返回。
那么,現在讓我們看看,如果我們直接把參數傳遞給 MyViewModel 類的構造方法時會發生了什么:
現在,我們在活動中創建 MyViewModel 實例:
太棒了!沒有發生任何錯誤
但是,等等。
當你運行上面這段代碼的時候,你收到了 RunTimeError。程序崩潰了!!! RuntimeException 不能創建出 MyViewModel 實例。
現在我們為什么會發生這些。ViewModelProviders 的 of() 方法,在內部創建了默認的 ViewModelProvider.Factory ,從而實現了 ViewModel 的無參創建。所以,當我們在構造方法添加參數時, ViewModelProvider.Factory 的內部無法實例化 ViewModel 對象,因為 ViewModelProvider.Factory 調用主構造方法創建 ViewModel’s 實例而失敗。下圖是 ViewModelFactory ViewModelFactory 的默認實現。
如果你想在構造方法中添加參數,你需要編寫自己的 ViewModelProvider 來創建 ViewModel 實例。
什么是 ViewModelProvider.Factory?
ViewModelProviders.Factory 接口是負責實例化 ViewModels 對象的啟動裝置。這意味着你需要自己寫實例化 ViewModel 對象的方法。
讓我們像下面這樣創建自己的 ViewModelProvider.Factory :
這里有幾點需要記下:
- 你需要通過構造方法或者其他你喜歡的途徑(比如 Singleton, FactoryPattern 等等)。這是由於你在實例化 ViewModel 對象時,不能直接在活動或者碎片中調用 ViewModel 的構造方法,而且你又想去設置 ViewModel 構造方法的參數,因此你需要將參數傳入 ViewModelProvider.Factory 它將會幫你創建你的 ViewModel。
- ViewModelProvider.Factory 是一個包含 create 方法的接口。這個 create 方法負責創建你的 VeiwModel’s 實例。
- modelClass.getConstructor(Int::class.java) 方法是一個整型的能夠通過調用 newInstance 方法來想構造方法傳值的方法。
現在就讓我們通過 ViewModelProvider.Factory 在活動中創建 ViewModel 實例。
我們將參數或者依賴關系轉入我們的 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 實例中去
你的關注是我最大的動力!