【问题标题】:Dagger2 - How to use @Named with @BindsInstanceDagger2 - 如何使用 @Named 和 @BindsInstance
【发布时间】:2019-01-09 17:10:08
【问题描述】:

@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

但是它失败了,因为 String 的 MissingBinding。我可以使用模块提供程序解决此问题,但尽量避免提供常量提供程序。

【问题讨论】:

    标签: kotlin dagger-2 dagger


    【解决方案1】:

    更新:Dagger 2.25.2 已不再需要解决方法:

    1. Kotlin 支持

      二。现在可以理解字段上的限定符注释,而无需 需要@field:MyQualifier (646e033)

      三。 @Module 对象类不再需要 @JvmStatic 提供方法。 (0da2180)


    这与@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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多