Google提供的涵盖Android架构组件的最新示例之一是GithubBrowserSample。我查看了代码并出现了一些问题:
我注意到ViewModelModule中包含AppModule。这意味着所有视图模型都被添加到DI图中。为什么要以这种方式完成,而不是为每个Activity / Fragment单独Module
,只为特定的Activity / Fragment提供所需的ViewModel
?
在此特定示例中,使用GithubViewModelFactory实例化视图模型有没有办法将参数传递给特定的ViewModel
?或者更好的解决方案是在ViewModel
中创建一个setter并通过setter设置所需的param?
答案 0 :(得分:11)
- [...]这意味着所有视图模型都被添加到DI图中。为什么要以这种方式完成,而不是为每个Activity / Fragment [...]提供单独的模块?
醇>
它们被添加到DI图中,但尚未创建。相反,它们最终出现在提供者的地图中,如seen in the 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);
至于为什么......或者你可以为每个Activity / Fragment创建一个ViewModelProvider.Factory
并在每个Module中注册实现。不过,这将是很多重复的样板代码。
- 在这个具体的例子中,使用GithubViewModelFactory实例化视图模型有没有办法将参数传递给特定的ViewModel?或者更好的解决方案是在ViewModel中创建一个setter并通过setter设置所需的param?
醇>
似乎所有ViewModel都只依赖@Singleton
个对象 - 这是必要的,因为它们都是从AppComponent提供的。这意味着除了其他@Singleton
依赖项之外,无法传递“参数”。
因此,正如您所建议的那样,您必须将工厂向下移动到Activity / Fragment组件中,以便您可以提供较低范围的依赖项,或使用setter方法。