我遇到了这个问题:
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,但结果相同。
答案 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对于将来避免这种情况很有帮助。