android - 了解 Android 架构组件示例 GithubBrowserSample : ViewModelModule, ViewModel 参数

标签 android dagger-2 android-architecture-components dagger android-viewmodel

涵盖 Android 架构组件的最新示例之一是 GithubBrowserSample由谷歌提供。我查看了代码并提出了一些问题:

  1. 我注意到 ViewModelModule包含在 AppModule 中.这意味着所有 View 模型都添加到 DI 图中。为什么以这种方式完成,而不是为每个 Activity/Fragment 单独的 Module 只为特定的 Activity/Fragment 提供所需的 ViewModel

  2. 在这个特定示例中, View 模型使用 GithubViewModelFactory 进行实例化有没有办法将参数传递给特定的ViewModel?或者更好的解决方案是在 ViewModel 中创建一个 setter 并通过 setter 设置所需的参数?

最佳答案

  1. [...] It means that all the viewmodels are added to the DI graph. Why that is done in that way instead of having separate Module for each Activity/Fragment [...]?

它们已添加到 DI 图中,但尚未创建。相反,它们最终出现在供应商 map 中,如 seen in the ViewModelFacory .

@Inject
public GithubViewModelFactory(Map<Class<? extends ViewModel>, Provider<ViewModel>> creators) { }

所以我们现在有一个 GithubViewModelFactory,它有一个提供者列表,并且可以创建任何绑定(bind)的 ViewModel。 fragment 和 Activity 现在可以只注入(inject)工厂并检索它们的 ViewModel。

@Inject
ViewModelProvider.Factory viewModelFactory;

// ...later...
repoViewModel = ViewModelProviders.of(this, viewModelFactory).get(RepoViewModel.class);

至于为什么...或者,您可以为每个 Activity/Fragment 创建一个 ViewModelProvider.Factory 并在每个模块中注册实现。不过,这将是很多重复的样板代码。

  1. In this specific example, where viewmodels are instantiated using GithubViewModelFactory is there any way to pass a parameter to the specific ViewModel? Or the better solution would be to create a setter in ViewModel and set needed param via setter?

似乎所有的 ViewModel 只依赖于 @Singleton 对象——这是必要的,因为它们都是从 AppComponent 提供的。这意味着除了其他 @Singleton 依赖项之外,没有办法传入“参数”。

因此,正如您所建议的,您要么必须将工厂向下移动到 Activity/Fragment 组件中,以便提供范围更小的依赖项,要么使用 setter 方法。

关于android - 了解 Android 架构组件示例 GithubBrowserSample : ViewModelModule, ViewModel 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46278357/

相关文章:

android - Dagger2 Qualifier 不适用于 Kotlin?

java - 如何注入(inject)单例?

android - 通过导航架构组件进行深度链接后的反向导航

android - 在android中使用自定义数据集创建 ListView ?

java - 通知恢复应用程序而不是重新启动

java - 使用 Dagger 注入(inject) Activity

android - 用于位置跟踪的前台服务与 WorkManager

Android 位图缩放不正确

java - Android - BluetoothChat 示例 - 为什么他们在这种情况下使用同步?

android - Room Dao LiveData 作为返回类型导致编译时错误