web-dev-qa-db-ja.com

ViewModelの同じインスタンスを親と子の両方のフラグメントに与える方法

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つの個別のインスタンスを作成しています。

親と子の両方のフラグメント間でデータを共有できるように、同じインスタンスを返すようにするにはどうすればよいですか?

ParentFragmentChildFragmentの代わりにChildFragmentModuleを渡そうとしましたが、それはDagger依存性注入エラーにつながります。

11
mhtmalpani

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);
19
Abu Yousuf