java - @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
? 因为我从不使用该方法。而且我有一张地图包含在图表中,所以我认为除非我调用它,否则它不能使用。
解决方案
@Binds
类似于@Provides
,只是它用于提供接口、抽象类或在您的案例中扩展的类。所以不需要任何配置,@Provides
也不需要调用。
虽然@IntoMap
用作命令将put
您的键放入映射中,其中键由@ClassKey
或@ViewModelKey
在您的情况下提供,值由 提供@Binds
。
还请检查文档,因为我的解释是针对您的具体情况的。但这是基本的。来自 Daggers Javadoc:
@Binds
注释委托绑定的模块的抽象方法。例如,要将 Random 绑定到 SecureRandom,模块可以声明以下内容: @Binds abstract Random bindRandom(SecureRandom secureRandom); @Binds 方法是提供仅返回注入参数的方法的替代方法。首选@Binds,因为生成的实现可能更高效。
@IntoMap
该方法的返回类型构成了 Map> 值的类型参数,带注释的键和返回值的组合作为键/值对贡献给映射。由值累积产生的 Map> 将是不可变的。
推荐阅读
- python - 将多元 python 函数与一个位置参数集成
- int - 如何在 PyTorch 中将布尔张量转换为整数?
- python - 如何在 Python 中保存绘图图形
- optaplanner - 用于 PlanningVariable 字段的 InverseRelationShadowVariable
- amazon-web-services - AWS EC2 托管网站的名称服务器更新
- php - 下拉列表正在填充 laravel 6 中的空列表
- github - Github 自定义拉取请求模板
- python - 如何在 python 中“正确”使用可执行程序
- javascript - d3v4 Saw Chart -- 半饼图示例和基于弧的示例
- asp.net-core - Asp.net core Razor Page - JQ 数据表不加载数据