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

时间:2017-11-04 19:35:39

标签: android dependency-injection kotlin dagger-2

修改

解决了这个问题。请参阅下面的帖子。

我正在编写一个使用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类。

我缺少什么帮助?

1 个答案:

答案 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