使用provider而不是构造函数注入的视图模型的匕首多绑定

时间:2019-06-24 15:02:29

标签: java android dagger-2 dagger

关于如何将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进行构造函数注入。

0 个答案:

没有答案