Kotlin中Dagger 2带Named参数的构造注入编译失败解决方案咨询
解决Dagger注入带@Named限定符的接口依赖报错问题
你遇到的核心问题是Dagger没正确识别构造函数参数上的@Named限定符,导致它在寻找无标注的Spice类型依赖,而非对应名称的实例。下面一步步帮你搞定:
问题根源
你在SpiceMix构造函数参数上用了@field:[Named("xxx")],这个注解是作用在类的成员字段上的,但Dagger处理构造函数注入时,只会检查构造函数参数本身的注解。所以Dagger看到的是未加限定符的Spice参数,自然找不到对应的@Provides方法,就抛出了那个错误。
修复方案
把构造函数参数上的@field:Named改成@param:Named(或者直接写@Named就行,因为Kotlin中构造函数参数的注解默认目标就是param):
修改后的SpiceMix类:
@Singleton class SpiceMix @Inject constructor( @Named("oregano") private val oregano: Spice, @Named("sage") private val sage: Spice, @Named("rosemary") private val rosemary: Spice )
如果想更清晰地标注注解目标,也可以显式写@param::
@Singleton class SpiceMix @Inject constructor( @param:Named("oregano") private val oregano: Spice, @param:Named("sage") private val sage: Spice, @param:Named("rosemary") private val rosemary: Spice )
你的SpiceModule完全没问题,不需要修改——每个@Provides方法都带了对应的@Named限定符和@Singleton,和修改后的构造函数参数注解匹配后,Dagger就能正确找到对应依赖了。
测试时Mock依赖的方法
因为Spice是接口,你可以在测试中创建一个测试Module,提供Mock的Spice实例,同样带上对应的@Named注解:
@Module class TestSpiceModule { @Provides @Named("oregano") @Singleton fun provideMockOregano(): Spice = mock(Spice::class.java) @Provides @Named("sage") @Singleton fun provideMockSage(): Spice = mock(Spice::class.java) @Provides @Named("rosemary") @Singleton fun provideMockRosemary(): Spice = mock(Spice::class.java) }
之后在测试用的Dagger组件中,用这个TestSpiceModule替换原来的SpiceModule,注入的SpiceMix就会使用你Mock的Spice实例了。
内容的提问来源于stack exchange,提问作者Vas
相关产品推荐
相关产品推荐

