El module debe ser configurado

Intento usar la nueva inyección de Dagger con Android que funciona hasta ahora.

Ahora quiero extenderlo a mis necesidades.

En mi MainActivityModule agregué un TestModule :

 @Module abstract class MainActivityModule { @ActivityScope @ContributesAndroidInjector(modules = arrayOf(TestModule::class)) internal abstract fun contributeMainActivityInjector(): MainActivity } 

El TestModule es realmente simple:

 @Module internal abstract class TestModule { @Provides internal fun provideTest(): String { return "foo bar" } } 

Pero me sale este error: TestModule must be set

Miré el código fuente generado, pero no puedo encontrar una pista de lo que tengo que hacer. También busqué esto en Google, pero solo encontré ejemplos simples 🙁

¿Qué he olvidado? Puede encontrar la aplicación completa en GitHub .

Editar

Como provideTest() Jeff Bowman, el provideTest() debe ser estático. Cuando creo una class Java como esta:

 @Module public class TestModule { @Provides static String provide() { return "foo bar"; } } 

funciona.

Entonces la pregunta final: ¿Cómo hacer esto en Kotlin? Esto no funciona:

 @Module internal abstract class TestModule { companion object { @Provides @JvmStatic internal fun provideTest(): String { return "foo bar" } } } 

Entonces necesito otra forma de crear un método estático.

Sí, encontré una solución 🙂

La forma de Kotlin de get un método static es poner el método en un companion object pero ahora Dagger arroja un error que @Provides que @Provides solo se puede usar en un @Module . Para arreglar esto anoté el companion object también

 @Module internal abstract class TestModule { @Module companion object { @Provides @JvmStatic internal fun provideTest(): String { return "foo bar" } } } 

Una solución alternativa, que es un poco más limpia en caso de que necesite simular / replace dependencies en las testings, sería evitar que la class sea abstracta, y mantener el suministro no estático, como este:

 @Module internal class TestModule { @Provides internal fun provideTest(): String { return "foo bar" } } 
  • Información de Facebook no se muestra
  • Cómo hacer que Kotlin deje de lanzar el argumento a la class incorrecta (Interfaz)
  • Android OutOfMemoryError: no se pudo asignar una asignación de bytes 57993496 con 16764448 bytes libres
  • ¿Cómo agregar sintéticamente actividad a la stack trasera antes de comenzar otra?
  • Marque los parameters no utilizados en Kotlin
  • BDD en Android con Kotlin
  • ¿Puedo usar @autowire (spring-context) para una aplicación de escritorio kotlin?
  • Kotlin runtime jar vs kotlin stdlib jar
  • ¿Cómo puedo conectar un productor a un actor?
  • Cómo crear una biblioteca reutilizable
  • Excepción al analizar expresiones en AppDatabase