首页 > 解决方案 > @IntoMap @Binds 如何与 Dagger 一起工作?

问题描述

我正在使用Dagger并且我想要@inject一个Repository我的ViewModel所以我创建了一个抽象模块,我Map在其中存储库类:

我的抽象模块:

@Module
abstract class RepositoryModule{

    @Binds
    @IntoMap
    @ClassKey(RepositoryStatus::class)
    abstract fun provideRepositoryStatus(repositoryStatus: RepositoryStatus): RepositoryStatus
}

我的ViewModel模块包括RespositoryModule

@Module(includes = [
    RepositoryModule::class
])
abstract class ViewModelModule {
    @Binds
    @IntoMap
    @ViewModelKey(MainViewModel::class)
    abstract fun bindsMainViewModel(viewModel: MainViewModel): ViewModel
}

我不知道这到底是如何工作的,Dagger 怎么知道我有一张地图并且我将它与我的ViewModel? 因为我从不使用该方法。而且我有一张地图包含在图表中,所以我认为除非我调用它,否则它不能使用。

标签: javaandroidkotlindagger-2

解决方案


@Binds类似于@Provides,只是它用于提供接口、抽象类或在您的案例中扩展的类。所以不需要任何配置,@Provides也不需要调用。

虽然@IntoMap用作命令将put您的键放入映射中,其中键由@ClassKey@ViewModelKey在您的情况下提供,值由 提供@Binds

还请检查文档,因为我的解释是针对您的具体情况的。但这是基本的。来自 Daggers Javadoc:

@Binds

注释委托绑定的模块的抽象方法。例如,要将 Random 绑定到 SecureRandom,模块可以声明以下内容: @Binds abstract Random bindRandom(SecureRandom secureRandom); @Binds 方法是提供仅返回注入参数的方法的替代方法。首选@Binds,因为生成的实现可能更高效。

@IntoMap

该方法的返回类型构成了 Map> 值的类型参数,带注释的键和返回值的组合作为键/值对贡献给映射。由值累积产生的 Map> 将是不可变的。


推荐阅读