关于如何将ViewModel与dagger2结合使用的所有示例都是在ViewModelFactory上使用构造函数注入。像这样:
private final Map<Class<? extends ViewModel>, Provider<ViewModel>> providers;
@Inject
public ViewModelFactory(Map<Class<? extends ViewModel>, Provider<ViewModel>> providers) {
this.providers = providers;
}
虽然该模块可能看起来像这样。
@Module
abstract class ViewModelModule {
@SuppressWarnings("unused")
@Binds
@IntoMap
@ViewModelKey(value = SomeViewModel.class)
abstract ViewModel bindSomeViewModel(SomeViewModel viewModel);
@SuppressWarnings("unused")
@Binds
abstract ViewModelProvider.Factory
bindViewModelFactory(ViewModelFactory viewModelFactory);
}
现在,因为我想编写可重用的代码,所以我想将工厂迁移到另一个android库模块中。因此,我希望能够执行以下操作:
新的构造函数(只需将@Inject删除):
private final Map<Class<? extends ViewModel>, Provider<ViewModel>> providers;
public ViewModelFactory(Map<Class<? extends ViewModel>, Provider<ViewModel>> providers) {
this.providers = providers;
}
和模块:
@Module
abstract class ViewModelModule {
@SuppressWarnings("unused")
@Binds
@IntoMap
@ViewModelKey(value = SomeViewModel.class)
abstract ViewModel bindSomeViewModel(SomeViewModel viewModel);
@SuppressWarnings("unused")
@Provides
ViewModelProvider.Factory
provideViewModelFactory(Map<Class<? extends ViewModel>, Provider<ViewModel>> providers) {
// Manually creates the ViewModelFactory.
return new ViewModelFactory(providers);
}
}
这给了我以下错误
error: com.example.project.ViewModelModule has errors
如何使用@Provides注入驻留在另一个模块中的ViewModelProvider.Factory,以使用它在构造函数中创建的可能的视图模型?
基本上,我将不使用@Provides并显式调用构造函数,而不是让Dagger在此处使用@Binds进行构造函数注入。