私は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;
}
}
ドキュメントを実験的に読んでいないだけでなく、アーキテクチャコンポーネントについて知っているだけで、スコープをどのように管理しているかがわかります。たとえば、構成の変更時に新しい段取りコンポーネントを作成した場合、スコープがコンポーネントに関連付けられているため、このコンポーネントによって提供されるビューモデルと以前のバージョンとが異なる場合があります。私がドキュメントから得たことは、あなたが '' ViewModelProviders.of''を使ってもこれが起こらないということです。これは、短剣コンポーネントが同じである限り、発生しません。提供されるビューモデルも同じです。 – Fred
ViewModelProvidersは、現在のアクティビティまたはその断片にスコープ、および構成変更に次のインスタンスに渡されるストレージを提供します。あなたの代わりにグローバルシングルトンとしてあなたのViewModelを宣言すると状態が異なる活動またはフラグメントのインスタンス間で共有されますので、それは問題を引き起こす可能性があり、また、ViewModelには、活動またはフラグメントで破壊されることはありません。 – BladeCoder