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
?
- 使用@ Component.Builder和构造函数参数
- 在Kotlin中使用基于注释的依赖注入时,哪种语法是优选的?
- 用匕首使用Kotlin
- 匕首2.11 – 如何让Activity和Fragment共享共同的价值观?
- 尝试使用Dagger2和Kotlin将ViewModelProvider注入到Activity时出错
- Kotlin错误:匕首不支持注入私人领域
- Kotlin:在命令行中运行kapt来为DI生成存根
- 如果没有kotlin中的@ Provide-或@ Produces注解方法,则不能提供上下文
- AndroidInjector <android.app.Activity>不能提供@ Provide或者@ Produces注解的方法