@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 for String而失败。我可以使用模块提供程序解决此问题,但尝试避免为常量提供程序。
答案 0 :(得分:2)
这与@BindsInstance
没有任何关系,但是与字段上的@Named
注释无关。您可以从“ MissingBinding for 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希望对其进行注释的是基础字段。
相关:Dagger 2 constructor injection in kotlin with Named arguments