作者:可靠的aaaaaaaaaaa_818 | 来源:互联网 | 2023-01-17 23:38
如何解决《了解Android架构组件示例GithubBrowserSample:ViewModelModule,ViewModel参数》经验,为你挑选了1个好方法。
涵盖Android架构组件的最新样本之一是Google提供的GithubBrowserSample.我查看了代码并出现了一些问题:
我注意到ViewModelModule包含在AppModule中.这意味着所有视图模型都被添加到DI图中.为什么以这种方式完成而不是Module
为每个只提供ViewModel
特定活动/片段所需的活动/片段分开?
在这个具体的例子中,使用GithubViewModelFactory实例化视图模型有没有办法将参数传递给特定的ViewModel
?或者更好的解决方案是创建一个setter ViewModel
并通过setter设置所需的param?
David Medenj..
11
[...]这意味着所有视图模型都被添加到DI图中.为什么以这种方式完成而不是为每个Activity/Fragment [...]分别设置模块?
它们被添加到DI图中,但尚未创建.相反,它们最终出现在提供者的地图中,如ViewModelFacory中所示.
@Inject
public GithubViewModelFactory(Map, Provider> creators) { }
所以我们现在有一个GithubViewModelFactory
提供者列表,可以创建任何ViewModel
绑定的.片段和活动现在可以注入工厂并检索他们的ViewModel.
@Inject
ViewModelProvider.Factory viewModelFactory;
// ...later...
repoViewModel = ViewModelProviders.of(this, viewModelFactory).get(RepoViewModel.class);
至于为什么......或者你可以ViewModelProvider.Factory
为每个Activity/Fragment 创建一个并在每个Module中注册实现.但是,这将是许多重复的样板代码.
在这个具体的例子中,使用GithubViewModelFactory实例化视图模型有没有办法将参数传递给特定的ViewModel?或者更好的解决方案是在ViewModel中创建一个setter并通过setter设置所需的param?
似乎所有ViewModel都只依赖于@Singleton
对象 - 这是必要的,因为它们都是从AppComponent提供的.这意味着除了其他@Singleton
依赖项之外,无法传入"参数" .
因此,正如您所建议的那样,您必须将工厂向下移动到Activity/Fragment组件中,以便您可以提供较低范围的依赖项,或使用setter方法.
1> David Medenj..:
[...]这意味着所有视图模型都被添加到DI图中.为什么以这种方式完成而不是为每个Activity/Fragment [...]分别设置模块?
它们被添加到DI图中,但尚未创建.相反,它们最终出现在提供者的地图中,如ViewModelFacory中所示.
@Inject
public GithubViewModelFactory(Map, Provider> creators) { }
所以我们现在有一个GithubViewModelFactory
提供者列表,可以创建任何ViewModel
绑定的.片段和活动现在可以注入工厂并检索他们的ViewModel.
@Inject
ViewModelProvider.Factory viewModelFactory;
// ...later...
repoViewModel = ViewModelProviders.of(this, viewModelFactory).get(RepoViewModel.class);
至于为什么......或者你可以ViewModelProvider.Factory
为每个Activity/Fragment 创建一个并在每个Module中注册实现.但是,这将是许多重复的样板代码.
在这个具体的例子中,使用GithubViewModelFactory实例化视图模型有没有办法将参数传递给特定的ViewModel?或者更好的解决方案是在ViewModel中创建一个setter并通过setter设置所需的param?
似乎所有ViewModel都只依赖于@Singleton
对象 - 这是必要的,因为它们都是从AppComponent提供的.这意味着除了其他@Singleton
依赖项之外,无法传入"参数" .
因此,正如您所建议的那样,您必须将工厂向下移动到Activity/Fragment组件中,以便您可以提供较低范围的依赖项,或使用setter方法.