修改
解决了这个问题。请参阅下面的帖子。
我正在编写一个使用Dagger和Kotlin的Android应用程序。
我想将java.text.SimpleDateFormat
课程注入我的班级DateHelper
@Singleton
class DateHelper @Inject constructor(var dateFormat: SimpleDateFormat) {
...
}
我有一个模块,@Provides
SimpleDateFormat
。
@Module
class DateModule {
@Singleton
@Provides
fun dateFormat(): SimpleDateFormat {
return SimpleDateFormat("yyyy-MM-dd", Locale.US)
}
}
和Dagger组件:
@Singleton
@Component(modules = arrayOf(MyAppModule::class, DateModule::class))
interface MyAppComponent {
...
}
最后是Application
:
open class MyApplication : Application() {
private lateinit var myAppComponent: MyAppComponent
override fun onCreate() {
super.onCreate()
myAppComponent = createGraph()
}
open fun createGraph(): MyAppComponent {
return DaggerMyAppComponent.builder().myAppModule(MyAppModule(this)).build()
}
fun getAppComponent(): MyAppComponent {
return myAppComponent
}
}
现在,我正在尝试@Inject
DateHelper
加入我的Fragment
:
class CoffeeNoteFragment : Fragment(), DatePickerDialog.OnDateSetListener {
@Inject lateinit var dateHelper: DateHelper
...
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
(activity.application as MyApplication).getAppComponent().inject(this)
}
}
不幸的是我收到编译时错误
error: [com.example.mateusz.coffeenotes.application.MyAppComponent.inject(com.example.mateusz.coffeenotes.CoffeeNoteFragment)] java.text.SimpleDateFormat cannot be provided without an @Inject constructor or from an @Provides-annotated method.
java.text.SimpleDateFormat is injected at
com.example.mateusz.coffeenotes.database.DateHelper.<init>(arg0)
com.example.mateusz.coffeenotes.database.DateHelper is injected at
com.example.mateusz.coffeenotes.CoffeeNoteFragment.dateHelper
com.example.mateusz.coffeenotes.CoffeeNoteFragment is injected at
com.example.mateusz.coffeenotes.application.MyAppComponent.inject(arg0)
我不明白为什么我收到此错误,因为我是@Providing
SimpleDateFormat
。显然我无法添加@Inject
构造函数,因为我没有SimpleDateFormat
类。
我缺少什么帮助?
答案 0 :(得分:0)
解决了问题
我没有意识到问题是由我用于测试的不同组件发生的。
我在TestComponent
中有src/debug/java/...
,它为我的测试提供了模拟实现:
@Singleton
@Component(modules = arrayOf(TestModule::class))
interface TestComponent : MyAppComponent
由于此组件扩展MyAppComponent
,我还必须提供绑定。很明显,我在这里错过了DateModule
。
更改为以下会修复编译错误:
@Singleton
@Component(modules = arrayOf(TestModule::class, DateModule::class))
interface TestComponent : MyAppComponent
我被编译错误消息误导,该消息表明MyAppComponent
缺少绑定,而实际问题在TestComponent
内。
我的推理是否正确,实际的错误消息应该引用TestComponent
?