涉及Architecture组件的最新示例之一是谷歌提供的GithubBrowserSample。我审查了守则,并提出了几个问题:
Module?ViewModel?或者更好的解决方案是在ViewModel中创建一个setter,并通过setter设置所需的param?发布于 2017-09-18 13:37:52
它们被添加到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);对于why...alternatively,您可以为每个活动/片段创建一个ViewModelProvider.Factory,并在每个模块中注册实现。不过,这将是许多重复的样板代码。
似乎所有的ViewModels都只依赖于@Singleton对象--这是必要的,因为它们都是从AppComponent提供的。这意味着除了其他@Singleton依赖项之外,没有其他传递“参数”的方法。
因此,正如您所建议的,您必须将工厂移到活动/片段组件中,以便提供范围更低的依赖关系,或者使用setter方法。
https://stackoverflow.com/questions/46278357
复制相似问题