Dagger2-如何将@Named与@BindsInstance一起使用

时间:2019-01-09 17:10:08

标签: kotlin dagger-2 dagger

@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而失败。我可以使用模块提供程序解决此问题,但尝试避免为常量提供程序。

1 个答案:

答案 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