了解 Android 架构组件示例 GithubBrowserSample:ViewModelModule、ViewModel 参数
Understanding Android Architecture Components example GithubBrowserSample: ViewModelModule, ViewModel parameters
涵盖 Android 架构组件的最新示例之一是由 Google 提供的 GithubBrowserSample。我查看了代码并出现了一些问题:
我注意到 ViewModelModule is included in AppModule。这意味着所有的视图模型都被添加到 DI 图中。为什么以这种方式完成,而不是为每个 Activity/Fragment 提供单独的 Module
,这将只为特定的 Activity/Fragment 提供所需的 ViewModel
?
在这个具体的例子中,视图模型是使用 GithubViewModelFactory 实例化的,有没有办法将参数传递给特定的 ViewModel
?或者更好的解决方案是在 ViewModel
中创建一个 setter 并通过 setter?
设置所需的参数
- [...] 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 图中,但尚未创建。相反,他们最终出现在供应商地图中,如 seen in the ViewModelFacory.
@Inject
public GithubViewModelFactory(Map<Class<? extends ViewModel>, Provider<ViewModel>> creators) { }
所以我们现在有一个 GithubViewModelFactory
,它有一个提供商列表,可以创建任何绑定的 ViewModel
。 Fragments 和 Activity 现在可以注入工厂并检索它们的 ViewModel。
@Inject
ViewModelProvider.Factory viewModelFactory;
// ...later...
repoViewModel = ViewModelProviders.of(this, viewModelFactory).get(RepoViewModel.class);
至于为什么...或者您可以为每个 Activity / 片段创建一个 ViewModelProvider.Factory
并在每个模块中注册实现。不过,这将是很多重复的样板代码。
- 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
依赖项之外,无法传入 "parameters"。
因此,正如您所建议的,您要么必须将工厂向下移动到 Activity / Fragment 组件中,以便您可以提供范围更小的依赖项,要么使用 setter 方法.
涵盖 Android 架构组件的最新示例之一是由 Google 提供的 GithubBrowserSample。我查看了代码并出现了一些问题:
我注意到 ViewModelModule is included in AppModule。这意味着所有的视图模型都被添加到 DI 图中。为什么以这种方式完成,而不是为每个 Activity/Fragment 提供单独的
Module
,这将只为特定的 Activity/Fragment 提供所需的ViewModel
?在这个具体的例子中,视图模型是使用 GithubViewModelFactory 实例化的,有没有办法将参数传递给特定的
ViewModel
?或者更好的解决方案是在ViewModel
中创建一个 setter 并通过 setter? 设置所需的参数
- [...] 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 图中,但尚未创建。相反,他们最终出现在供应商地图中,如 seen in the ViewModelFacory.
@Inject
public GithubViewModelFactory(Map<Class<? extends ViewModel>, Provider<ViewModel>> creators) { }
所以我们现在有一个 GithubViewModelFactory
,它有一个提供商列表,可以创建任何绑定的 ViewModel
。 Fragments 和 Activity 现在可以注入工厂并检索它们的 ViewModel。
@Inject
ViewModelProvider.Factory viewModelFactory;
// ...later...
repoViewModel = ViewModelProviders.of(this, viewModelFactory).get(RepoViewModel.class);
至于为什么...或者您可以为每个 Activity / 片段创建一个 ViewModelProvider.Factory
并在每个模块中注册实现。不过,这将是很多重复的样板代码。
- 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
依赖项之外,无法传入 "parameters"。
因此,正如您所建议的,您要么必须将工厂向下移动到 Activity / Fragment 组件中,以便您可以提供范围更小的依赖项,要么使用 setter 方法.