Dagger2 - 如何在@BindsInstance中使用@Named

4
@Named和@BindsInstance一起如何使用?我有这个组件。
interface AppComponent : AndroidInjector<MyApplication>{
    @Component.Builder
    abstract class Builder : AndroidInjector.Builder<MyApplication>() {

        @BindsInstance
        abstract fun preferenceName( @Named("PreferenceName") name : String ) : Builder
    }
}

并尝试在MyApplication中注入

@Inject
@Named("PreferenceName")
lateinit var prefName : String

但是遇到字符串的MissingBinding问题时会出现失败。我可以通过使用模块提供程序来解决此问题,但尝试避免在常量中使用提供程序。
1个回答

3
更新:Dagger 2.25.2已经消除了解决方法的需要:
  1. Kotlin支持

    ii.现在可以理解字段上的限定符注释而不需要@field:MyQualifier (646e033)

    iii.@Module对象类不再需要在提供方法上使用@JvmStatic。(0da2180)


这与@BindsInstance无关,而是与字段上的@Named注释有关。从“缺少String绑定”可以看出,否则会出现有关命名字符串的错误。
正如Svetlozar Kostadinov在他的文章Correct usage of Dagger 2 @Named annotation in Kotlin中所述,您需要向Kotlin澄清希望将注释应用于字段。
@field:[Inject Named("PreferenceName")]
lateinit var prefName : String;

作为Svetlozar所说:
原因是因为在Kotlin中,注解需要稍微复杂一些才能按照Java的预期工作。这是因为一个Kotlin元素可能是在字节码中发出的多个Java元素的外观。例如,一个Kotlin属性是底层Java成员变量、getter和setter的外观。你注释了属性,但Dagger希望注释的是底层字段。
相关链接:使用命名参数在Kotlin中进行Dagger 2构造函数注入

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接