2

我有一個叫做RecipesViewModel的ViewModel。通常情況下,我實例化這種方式:直接實例化ViewModel,而不使用ViewModelProviders.of方法

RecipesViewModel viewModel = ViewModelProviders.of(this, new ViewModelProvider.Factory() { 
      @Override 
      public <T extends ViewModel> T create(Class<T> modelClass) { 
       return (T) new RecipesViewModel(recipesRepository); 
      } 
     }).get(RecipesViewModel.class); 

但現在我使用dagger2,所以我把@Inject註解這個視圖模型的構造,所以我可以直接在我的片段注入它,使用現場注射器。

我的問題是:我是否會失去一些啓動viewmodel這種方式而不是ViewModelProviders.of的方式?我的ViewModel已經是Scoped,所以在上下文中只創建一個實例。

其他選項是隻將工廠實例移動到dagger2模塊,但如果沒有問題,我更喜歡第一個方法。

- 編輯 -

閱讀該文檔android.arch.lifecycle.ViewModel,我有點更害怕。使用ViewModelProviders.of來提供範圍(片段或活動)。如果我直接實例化它,範圍是什麼?

ViewModel是一個類,負責準備和管理活動或片段的數據。它還處理Activity/Fragment與 應用程序的其餘部分(例如調用業務邏輯類)的 通信。

ViewModel始終與範圍(片段 或活動)相關聯地創建,並且只要該範圍處於活動狀態,它將被保留。 例如如果它是一個活動,直到完成。

換句話說,這意味着如果 的所有者因配置更改(例如旋轉)而被銷燬,ViewModel將不會被銷燬。所有者的新實例 將重新連接到現有的 ViewModel。

- /編輯 -

的RecipesViewModel代碼如下表所示:

@PerActivity 
public class RecipesViewModel extends ViewModel { 
    private static final String TAG = "RecipesViewModel"; 
    private final RecipesRepository recipesRepository; 

    private LiveData<List<Recipe>> recipes = null; 

    @Inject 
    public RecipesViewModel(RecipesRepository recipesRepository) { 
     this.recipesRepository = recipesRepository; 
    } 

    public final void loadAll() { 
     recipes = recipesRepository.getRecipes(); 
    } 

    public LiveData<List<Recipe>> getRecipes() { 
     return recipes; 
    } 
} 
+1

沒有試驗,只從文檔中閱讀,以及我對建築組件的瞭解,都歸結爲您如何管理範圍。例如,如果在配置更改時創建了一個新的Dagger組件,那麼由該組件提供的視圖模型肯定會與之前的視圖模型不同,因爲範圍與組件綁定。我從文檔中得到的是,如果使用''ViewModelProviders.of'',這不會發生。只要匕首組件是相同的,這也不會發生 - 所提供的視圖模型也是相同的。 – Fred

+0

ViewModelProviders提供一個存儲空間,該存儲空間的作用域是當前Activity或fragment,並在配置更改時傳遞給下一個實例。如果您將ViewModel聲明爲全局單例,則可能會導致問題,因爲狀態將在不同的活動或片段實例之間共享,並且ViewModel也不會使用Activity或Fragment銷燬。 – BladeCoder

回答

0

對於我來說,現在(我需要研究這一點),但注射視圖模型代替使用ViewModelProviders功能意味着你失去了一些簡單的活動片段通信。

例如from the docs他們提供了一個託管2個片段的活動的例子。如果一個片段需要與另一個片段進行交談,則以前的方法是通過活動來維護一個接口,該活動還必須處理該接口的生命週期。相反,現在只要你需要,你可以從ViewModelProviders'repo'中獲取它。

相關問題