首页 > 解决方案 > Dagger2 地图多重绑定 - [Dagger/MissingBinding]

问题描述

我正在使用Moshiforserializationdeserializationof 字符串来枚举和返回。为此,我设置了JsonAdapter.Factory. 我知道已经enum提供了一个适配器,Moshi但问题是它使用了 finalname()方法,Enum并且我的一些字符串以数字开头,所以我的枚举前缀为_(下划线)。

因此,在设置 thisJsonAdapter.Factory时,我想将其设置为可重用的 Factoy,它可用于任何扩展接口ParcelableEnum、实现ParcelableEnum.Factory接口且字段带有StringToEnum注解的 Enum。

为了实现这一点,我尝试Map使用Dagger. S,我创建了一个 Key 注释,将其附加到annotationBinds方法中,Module并尝试Map在我的代码中访问 。

ParcelableEnumAdapterKey

@Target(AnnotationTarget.FUNCTION)
@kotlin.annotation.Retention(AnnotationRetention.RUNTIME)
@MapKey
annotation class ParcelableEnumAdapterKey(val value : KClass<out ParcelableEnum>)

ParcelableEnumFactoryProvider

@Module
@InstallIn(SingletonComponent::class)
interface ParcelableEnumFactoryProvider {

   @Binds
   @IntoMap
   @ParcelableEnumAdapterKey(VideoQuality::class)
   fun bindsVideoQualityParcelableEnumFactory(factory: VideoQuality.VideoQualityFactory): ParcelableEnum.Factory

}

最后是我的JsonAdapter.Factory实现

StringToEnumAdapterFactory

class StringToEnumAdapterFactory @Inject constructor(
        private val factoriesMap: Map<KClass<ParcelableEnum>, @JvmSuppressWildcards Provider<ParcelableEnum.Factory>>
    ): JsonAdapter.Factory {

    // An implementation of this factory.
}

但由于某种原因,我收到以下错误:

error: [Dagger/MissingBinding] java.util.Map<kotlin.reflect.KClass<com.type.ParcelableEnum>,javax.inject.Provider<com.type.ParcelableEnum.Factory>> cannot be provided without an @Provides-annotated method.

我不确定我缺少什么,起初我认为这是一个Kotlin-Java通配符泛型不兼容问题,所以我添加JvmSuppressWildcardsProvides<ParcelableEnum.Factory>. 但即便如此,我还是遇到了上述错误。

标签: androidkotlindaggerdagger-hilt

解决方案


推荐阅读