有两个 Fragment:ParentFragment 和 ChildFragment。
ChildFragment
已添加到 ParentFragment
的 View 中。
现在使用 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)
}
这显然是在创建两个单独的 ViewModel
实例,因为它们接收两个不同的 fragment 实例。
我们如何让它返回相同的实例,以便数据可以在父 fragment 和子 fragment 之间共享?
我尝试在 ChildFragmentModule
中传递 ParentFragment
而不是 ChildFragment
,但这会导致 Dagger 依赖注入(inject)错误。
最佳答案
使用 Activity
范围创建您的 ViewModel
。然后该 Activity
中的所有 Fragment
将获得相同的 ViewModel
实例。
查看官方ViewModelProviders引用。您可以使用 Activity
和 Fragment
范围创建 ViewModel
。
ViewModelProvider of (FragmentActivity activity)
Creates a ViewModelProvider, which retains ViewModels while a scope of given Activity is alive. More detailed explanation is in ViewModel.
和
ViewModelProvider of (Fragment fragment)
Creates a ViewModelProvider, which retains ViewModels while a scope of given fragment is alive. More detailed explanation is in ViewModel.
创建ViewModel
的示例代码
来自 Activity :
movieListViewModel = ViewModelProviders.of(this).get(MovieListViewModel.class);
来自 fragment :
movieListViewModel = ViewModelProviders.of(getActivity()).get(MovieListViewModel.class);
关于android - 如何为父 fragment 和子 fragment 提供相同的 ViewModel 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50540123/