kotlin - 提供具有 Dagger 多绑定依赖项的实例时出错
问题描述
运行以下代码时出现错误。我正在尝试将使用 Dagger 多重绑定构造的地图注入到D
via@Provides
方法的实例中。
错误是:
error: [Dagger/MissingBinding] java.util.Map<java.lang.Class<dagger.A>,java.lang.String> cannot be provided without an @Provides-annotated method.
public abstract dagger.D d();
^
java.util.Map<java.lang.Class<dagger.A>,java.lang.String> is injected at
dagger.ModuleA.provideD(map)
dagger.D is provided at
dagger.ComponentA.d()
代码是:
open class A
class B : A()
class C : A()
data class D(val map: Map<Class<A>, String>)
@Module
object ModuleA {
@JvmStatic
@Provides
@IntoMap()
@ClassKey(B::class)
fun provideB(): String {
return "B"
}
@JvmStatic
@Provides
@IntoMap()
@ClassKey(C::class)
fun provideC(): String {
return "C"
}
@JvmStatic
@Provides
fun provideD(map: Map<Class<A>, String>): D {
return D(map)
}
}
@Component(modules = [ModuleA::class])
@Singleton
interface ComponentA {
fun d(): D
}
fun main(args : Array<String>) {
val dagger = DaggerComponentA.builder().build()
println(dagger.d())
}
我找不到任何直接的例子。我只找到使用地图本身的字段注入的示例。
我正在尝试支持吗?
解决方案
我想到了:
open class A
class B : A()
class C : A()
data class D(val map: Map<Class<out A>, String>)
@MapKey
internal annotation class MyClassKey(val value: KClass<out A>)
@Module
object ModuleA {
@JvmStatic
@Provides
@IntoMap()
@MyClassKey(B::class)
fun provideB(): String {
return "B"
}
@JvmStatic
@Provides
@IntoMap()
@MyClassKey(C::class)
fun provideC(): String {
return "C"
}
@JvmStatic
@Provides
@IntoMap()
@MyClassKey(A::class)
fun provideA(): String {
return "A"
}
@JvmStatic
@Provides
fun provideD(map: Map<Class<out A>, String>): D {
return D(map)
}
}
@Component(modules = [ModuleA::class])
@Singleton
interface ComponentA {
fun d(): D
}
fun main(args : Array<String>) {
val dagger = DaggerComponentA.builder().build()
val d = dagger.d()
println(d.map) // {class dagger.B=B, class dagger.C=C, class dagger.A=A}
}
我需要提供一个自定义@MapKey
注释:
@MapKey
internal annotation class MyClassKey(val value: KClass<out A>)
并改变
fun provideD(map: Map<Class<A>, String>): D {
至
fun provideD(map: Map<Class<out A>, String>): D {
推荐阅读
- python - 如何重命名 python 包?
- uwp - Uwp 使用 mvvm 绑定坐标值
- kubernetes - Kubernetes:你如何列出在 master 上运行的组件?
- python - Python:所有相同的值用“for~in”进入数组
- javascript - 无法通过 nodejs express 从 HTML/JS 客户端获取 ASP.NET Core 3 中的二进制数据
- c# - 检查是否调用了 WCF 服务
- mysql - sql如何选择具有两行或多行的组的倒数第二行
- networking - Taskmanager 无法连接到 Jobmanager [找不到任何不是环回或链路本地的 IPv4 地址。使用本地主机地址。]
- python - 如何使用 sklearn.decomposition FactorAnalysis 在 python 中获取因子载荷
- javascript - 打字稿:如何在构造函数之外初始化类属性