android - 如何为父 fragment 和子 fragment 提供相同的 ViewModel 实例

标签 android mvvm dependency-injection dagger android-viewmodel

有两个 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引用。您可以使用 ActivityFragment 范围创建 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/

相关文章:

java - 在运行时更改 Guice 绑定(bind)

android - 删除通知 xamarin

wpf - 从数据模板绑定(bind)到 View 模型的属性

android - 如何获取 firebase firestore android 中某些字段的值?

jquery - Kendo MVVM 自定义绑定(bind),用于单击复选框

c# - 按下按钮后设置文本框焦点

java - 为什么我们不应该使用查找而不是依赖注入(inject)?

dependency-injection - 使用 Jersey 测试框架的 JUnit 测试中的 CDI

android - 更改主题时仅更改颜色

java - 选项卡未调用 onCreateView