18

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

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

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

4

1 回答 1

11
  1. [...] 这意味着所有视图模型都添加到 DI 图中。为什么以这种方式完成,而不是为每个 Activity/Fragment [...] 设置单独的模块?

它们已添加到 DI 图中,但尚未创建。相反,它们最终出现在提供者的地图中,如ViewModelFacory 所示

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

所以我们现在有一个GithubViewModelFactory提供者列表,并且可以创建任何ViewModel绑定的。片段和活动现在可以只注入工厂并检索它们的 ViewModel。

@Inject
ViewModelProvider.Factory viewModelFactory;

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

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

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

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

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

于 2017-09-18T13:37:52.320 回答