Android Dagger:我无法提供没有@Inject构造函数的外部类

编辑

解决了这个问题。 看到我的帖子下面。

我正在使用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类。

任何帮助我失踪?

解决问题

我没有意识到从另一个组件发生的问题,我用它来测试。

我在src/debug/java/...有一个TestComponent ,它为我的测试提供了模拟实现:

 @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