Android Dagger: no puedo proporcionar una class externa sin el constructor @Inject

EDITAR

Resolvió el problema. Ver mi publicación a continuación.

Estoy escribiendo una aplicación de Android con el uso de Dagger y Kotlin.

Quiero inyectar la class java.text.SimpleDateFormat en mi class DateHelper

 @Singleton class DateHelper @Inject constructor(var dateFormat: SimpleDateFormat) { ... } 

Tengo un module, que @Provides SimpleDateFormat .

 @Module class DateModule { @Singleton @Provides fun dateFormat(): SimpleDateFormat { return SimpleDateFormat("yyyy-MM-dd", Locale.US) } } 

y un componente Daga:

 @Singleton @Component(modules = arrayOf(MyAppModule::class, DateModule::class)) interface MyAppComponent { ... } 

Por último mi 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 } } 

Ahora, bash @Inject DateHelper en mi 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) } } 

Lamentablemente, recibo un error en time de compilation

 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) 

No entiendo por qué @Providing este error, ya que estoy @Providing el SimpleDateFormat . Obviamente no puedo agregar el constructor @Inject , ya que no SimpleDateFormat class SimpleDateFormat .

¿Alguna ayuda de lo que me estoy perdiendo?

Resuelve el problema

No me di count de que el problema se produjo a partir de un componente diferente, que utilizo para las testings.

Tengo un TestComponent en src/debug/java/... , que proporciona implementaciones simuladas para mis testings:

 @Singleton @Component(modules = arrayOf(TestModule::class)) interface TestComponent : MyAppComponent 

Como este componente amplía MyAppComponent , también tengo que proporcionarle enlaces. Claramente, me falta el DateModule aquí. Cambiar a continuación corrige el error de compilation :

 @Singleton @Component(modules = arrayOf(TestModule::class, DateModule::class)) interface TestComponent : MyAppComponent 

El post de error de compilation me MyAppComponent error, que indicaba que MyAppComponent faltaba el enlace, mientras que el problema real se encuentra en TestComponent .

¿Mi razonamiento es correcto, que el post de error real debería referirse a TestComponent ?

  • Es `foo como? Foo` un equivalente completo de 'foo como Foo? `En kotlin?
  • Autenticación de formulario en Ktor
  • ¿Puede Delegates.observable () ser serializable?
  • ¿Qué packages / funciones se importan de manera pnetworkingeterminada en Kotlin?
  • ¿Por qué no puedo usar la interfaz como el tipo genérico en este transformador Rx?
  • Error: com.app.android.dagger.component.AppComponent (no codificado) no puede hacer reference a enlaces delimitados:
  • Android Studio 2.3.2 y Kotlin 1.1.2-4 + Enlace de datos
  • ¿Cómo adjuntar un elemento HTML o un DocumentFragment al DOM?
  • ¿Cómo get un KClin KClass de una cadena de nombre de class de package?
  • El context no se puede proporcionar sin un método @ Provides- o @ Produces-anotado en kotlin
  • My RecyclerView no se notifica adecuadamente