ParentFragmentとChildFragmentの2つのフラグメントがあります。 ChildFragment
のビューにParentFragment
が追加されました。
Dagger2
for AndroidにはParentFragmentModule
のメソッドがあります:
@Provides
fun provideViewModel(fragment: ParentFragment, myViewModelFactory: MyViewModelFactory): MyViewModel {
return ViewModelProviders.of(fragment, myViewModelFactory).get(MyViewModelImpl::class.Java)
}
MyViewModelFactory、MyViewModel、MyViewModelImplは、アプリで作成されたシンプルなViewModelロジックです。
また、ChildFragmentModuleには次のメソッドがあります。
@Provides
fun provideViewModel(fragment: ChildFragment, myViewModelFactory: MyViewModelFactory): MyViewModel {
return ViewModelProviders.of(fragment, myViewModelFactory).get(MyViewModelImpl::class.Java)
}
これは明らかに、2つの異なるフラグメントインスタンスを受け取るため、ViewModel
の2つの個別のインスタンスを作成しています。
親と子の両方のフラグメント間でデータを共有できるように、同じインスタンスを返すようにするにはどうすればよいですか?
ParentFragment
でChildFragment
の代わりにChildFragmentModule
を渡そうとしましたが、それはDagger依存性注入エラーにつながります。
ViewModel
スコープでActivity
を作成します。次に、そのFragment
内のすべてのActivity
が同じViewModel
インスタンスを取得します。
公式の ViewModelProviders リファレンスを確認してください。 ViewModel
スコープとActivity
スコープの両方でFragment
を作成できます。
ViewModelProvider of (FragmentActivity activity)
特定のActivityのスコープが有効である間、ViewModelを保持するViewModelProviderを作成します。より詳細な説明は、ViewModelにあります。
そして
ViewModelProvider of (Fragment fragment)
特定のフラグメントのスコープが生きている間、ViewModelsを保持するViewModelProviderを作成します。より詳細な説明は、ViewModelにあります。
ViewModel
を作成するためのサンプルコード
アクティビティから:
movieListViewModel = ViewModelProviders.of(this).get(MovieListViewModel.class);
フラグメントから:
movieListViewModel = ViewModelProviders.of(getActivity()).get(MovieListViewModel.class);