2

私はRecipesViewModelというViewModelを持っています。通常、私はそれをこのようにインスタンス化:ViewModelProviders.ofメソッドを使用せずにViewModelsを直接インスタンス化する

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注釈を入れたので、私は使用して、私のフラグメントに直接注入することができますよフィールドインジェクタ。

質問:私はViewModelProviders.ofの代わりにこのようにviewmodelを開始する何かを失うか?私のViewModelはすでにスコープされているので、1つのインスタンスだけがコンテキストで作成されます。

その他のオプションは、工場のインスタンシエーションのみをdagger2モジュールに移動することですが、問題がなければ最初のaproachを優先します。

- EDIT -

ドキュメントandroid.arch.lifecycle.ViewModelを読むと、私はもう少し怖いです。 WheはViewModelProviders.ofを使用してスコープ(フラグメントまたはアクティビティ)を提供します。スコープとなるものを直接インスタンス化すれば?

ViewModelは、アクティビティまたはフラグメントのデータを準備して管理するクラスです。また、アクティビティ/フラグメントと アプリケーションの残りの部分との通信(例えば、ビジネスロジッククラスの呼び出し)を で処理します。

ViewModelは常にスコープ(フラグメント またはアクティビティ)と関連付けて作成され、スコープが有効である限り保持されます。 など。アクティビティの場合は終了します。

つまり、構成変更(ローテーションなど)のためにオーナーが破棄された場合、ViewModelは破棄されません。オーナーの新しいインスタンス は、既存の ViewModelに再接続されます。

-/EDIT -

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

ドキュメントを実験的に読んでいないだけでなく、アーキテクチャコンポーネントについて知っているだけで、スコープをどのように管理しているかがわかります。たとえば、構成の変更時に新しい段取りコンポーネントを作成した場合、スコープがコンポーネントに関連付けられているため、このコンポーネントによって提供されるビューモデルと以前のバージョンとが異なる場合があります。私がドキュメントから得たことは、あなたが '' ViewModelProviders.of''を使ってもこれが起こらないということです。これは、短剣コンポーネントが同じである限り、発生しません。提供されるビューモデルも同じです。 – Fred

+0

ViewModelProvidersは、現在のアクティビティまたはその断片にスコープ、および構成変更に次のインスタンスに渡されるストレージを提供します。あなたの代わりにグローバルシングルトンとしてあなたのViewModelを宣言すると状態が異なる活動またはフラグメントのインスタンス間で共有されますので、それは問題を引き起こす可能性があり、また、ViewModelには、活動またはフラグメントで破壊されることはありません。 – BladeCoder

答えて

0

(と私はこれを研究する必要がある)が、代わりのビューモデルを注入ViewModelProviders機能を使用すると、簡単なアクティビティとフラグメント通信を失うことになります。

例えば、from the docsは、2つの断片を宿す活性の例を提供する。 1つのフラグメントが別のフラグメントと通信する必要がある場合、以前の方法では、そのインタフェースのライフサイクルを管理しなければならないアクティビティ経由のインタフェースを維持することでした。代わりに、必要なときにViewModelProvidersの 'repo'からすぐにフェッチすることができます。

関連する問題