【发布时间】:2018-02-17 13:13:40
【问题描述】:
我正在尝试将新的架构组件ViewModel 添加到我的应用程序中,同时用匕首注入它们。我的代码基于谷歌显示的here。我试图避免每个ViewModel 类型都有一个ViewModelFactory,所以我使用了接收Map<Class<? extends ViewModel>, Provider<ViewModel>> creators 的ViewModelFactory。它适用于与@Singleton 范围具有依赖关系的ViewModels。但是,我的ViewModels 之一具有来自片段的依赖关系。这是那个片段的模块:
@Module
public abstract class DownloadIssueDialogFragmentModule {
@Binds
abstract DialogFragment dialogFragment(DownloadIssueDialogFragment dialogFragment);
@Provides
@FragmentScope
static Issue provideIssue(DownloadIssueDialogFragment dialogFragment) {
return dialogFragment.getIssue();
}
}
还有我的ViewModelModule:
@Module
public abstract class ViewModelModule {
@Binds
abstract ViewModelProvider.Factory bindViewModelFactory(ViewModelFactory factory);
@Binds
@IntoMap
@ViewModelKey(DownloadIssueViewModel.class)
abstract ViewModel bindDownloadIssueViewModel(DownloadIssueViewModel viewModel);
}
dagger 说它无法提供Issue。这是有道理的,因为Map<Class<? extends ViewModel>, Provider<ViewModel>> 似乎是在编译时创建的。但我只会在该片段的范围内知道参数。我怎样才能做到这一点?
谢谢。
编辑:
最后我采用了不同的方法。现在我为每个 ViewModel 创建一个工厂,而不是注入 ViewModel,而是注入工厂。
我创建了这个库:AutoViewModelFactory
自动生成工厂。这是迄今为止我找到的最好的解决方案。
【问题讨论】:
-
你不能在同一个班级同时使用
@Binds和@Provides。您应该使用其中之一。仅供参考。 -
@mertsimsek 如果提供是静态的,您可以拥有
@Binds和@Provides。在尝试更改为 Google 之前,我使用自己的ViewModels 进行了此操作(我需要在轮换中保留ViewModels)。
标签: android mvvm dagger-2 dagger android-architecture-components