android - 带有命名参数的 Kotlin 中的 Dagger 2 构造函数注入(inject

我有这个依赖:

@Singleton
class SpiceMix @Inject constructor(@field:[Named("oregano")] private val oregano: Spice,
                                   @field:[Named("sage")] private val sage: Spice,
                                   @field:[Named("rosemary")] private val rosemary: Spice) 

还有一个模块来实现它的依赖:

@Module
class SpiceModule {

    @Provides
    @Named("oregano")
    @Singleton
    fun provideOregano(): Spice = Oregano()

    @Provides
    @Named("sage")
    @Singleton
    fun provideSage(): Spice = Sage()

    @Provides
    @Named("rosemary")
    @Singleton
    fun provideRosemary(): Spice = Rosemary()

然后将 SpiceMix 注入(inject)我的应用程序的各个位置。

但是,这不能编译,我得到一个错误:

Spice cannot be provided without an @Provides-annotated method

我认为@Named 注释在我的构造函数签名中不太适用。我不太确定如何让它发挥作用。

注意:如果我放弃命名注释并将构造函数参数的类型更改为它们的具体形式,这编译得很好。然而,Spice 是一个接口(interface),我在测试中需要它来模拟目的。

我能做什么?

最佳答案

如果您正在执行构造函数注入(inject),您想要注释构造函数参数,而不是字段 - 使用 @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)

编辑:实际上,因为注释目标的解析顺序是

  • param;
  • property;
  • field.

根据 docs ,没有注解目标的也应该注解构造函数的参数。所以你可以完全放弃目标:

@Singleton
class SpiceMix @Inject constructor(@Named("oregano") private val oregano: Spice,
                                   @Named("sage") private val sage: Spice,
                                   @Named("rosemary") private val rosemary: Spice)

关于android - 带有命名参数的 Kotlin 中的 Dagger 2 构造函数注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48442623/

相关文章:

kotlin - 如何使用 Gradle Kotlin 脚本创建胖 JAR?

java - 为什么可以在 Kotlin 的类之外编写函数?

hibernate - 如何使用 JpaRepository 进行批量(多行)插入?

android - 抑制 "Identifier not allowed in Android"

java - 在 Kotlin 中使用 Room 的 @ForeignKey 作为 @Entity

properties - 将静态变量从 Java 转换为 Kotlin

java - 安卓3.3.0更新,错误: Cause: invalid type code: 68

kotlin - 我可以省略在 Kotlin 中不使用的接口(interface)方法吗?

java - getActionView 已弃用?

android - Kotlin Android 打印到控制台