@Qualifier原因:字段注入时[Dagger / MissingBinding]

时间:2019-09-03 23:31:26

标签: android kotlin dependency-injection dagger-2

我遇到了这个问题:

  

ApplicationComponent.java:8:错误:[Dagger / MissingBinding] @ ...如果没有@Provides注释的方法,则无法提供java.text.SimpleDateFormat。

模块

@Module
abstract class ApplicationModule {

    @Binds
    @AppContext
    abstract fun application(app: App): Context

    @Module
    companion object {
        ...

        @Provides
        @Singleton
        @CalendarPickerDateFormat
        fun provideCalendarPickerDateFormat(): SimpleDateFormat {
            return SimpleDateFormat("dd/MMM/yyyy", Locale.getDefault())
        }
    }
}

限定符

@Qualifier
@Retention(AnnotationRetention.RUNTIME)
annotation class CalendarPickerDateFormat

课程

@ActivityScope
class MyClass
@Inject constructor(
   ...,
    @CalendarPickerDateFormat private val calendarDateFormat: SimpleDateFormat
) {...}

即使我将@Target(AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY)添加到 Qualifier ,并将类构造函数更改为@param:CalendarPickerDateFormat,我也会遇到相同的错误。

缺少什么?

可能的解决方案

添加@JvmStatic,例如:

@Provides
@Singleton
@JvmStatic
@CalendarPickerDateFormat
fun provideCalendarPickerDateFormat(): SimpleDateFormat {
      return SimpleDateFormat("dd/MMM/yyyy", Locale.getDefault())
}

解决构造函数注入问题,而不解决字段注入问题:

@Inject
@CalendarPickerDateFormat lateinit var date : SimpleDateFormat

为什么?

注意:我也尝试过@Module object class approach,但结果相同。

1 个答案:

答案 0 :(得分:0)

我在google/Daggers repo中打开了一个问题,这个PR将对此进行“修复”。实际上,这不是错误,正如 zsmb13 所述:

  

来自Kotlin官方文档:

If you don't specify a use-site target, the target is chosen according to the @Target annotation of the annotation being used. If
     

有多个适用目标,第一个适用目标   使用以下列表中的内容:

    param;
    property;
    field.
     

所以基本上,这是因为param是默认目标,而不是   指定。

但是此PR对于将来避免这种情况很有帮助。

编辑Dagger 2.25.2 fixes it.