它意味着所有的视图模型都被添加到DI图中。为什么要这样做,而不是为每个Activity/Fragment单独创建一个Module?它们被添加到DI图中,但它们尚未被创建。相反,它们最终会出现在提供程序映射中,如
在ViewModelFacory中看到的那样。
@Inject
public GithubViewModelFactory(Map<Class<? extends ViewModel>, Provider<ViewModel>> creators) { }
现在我们有了一个GithubViewModelFactory
,它拥有一系列的提供者并且可以创建任何已绑定的ViewModel
。Fragments和Activities现在只需要注入工厂并获取他们的ViewModel即可。
@Inject
ViewModelProvider.Factory viewModelFactory;
repoViewModel = ViewModelProviders.of(this, viewModelFactory).get(RepoViewModel.class);
关于为什么...另外你可以为每个Activity/Fragment创建一个
ViewModelProvider.Factory
,并在每个Module中注册实现。但这将会产生大量重复的样板代码。
在这个特定的例子中,使用GithubViewModelFactory实例化viewmodel时,是否有办法向特定的ViewModel传递参数?或者更好的解决方案是在ViewModel中创建setter方法,并通过setter设置所需的参数?
似乎所有的ViewModel都只依赖于
@Singleton
对象 - 这是必要的,因为它们都是从AppComponent提供的。这意味着除了其他
@Singleton
依赖项之外,没有其他传递“参数”的方法。
因此,正如你建议的那样,你要么必须将工厂移动到Activity/Fragment组件中,以便你可以提供较低范围的依赖项,要么使用setter方法。