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" } } 
  • iniciar AsyncTask por segunda vez
  • Cómo pasar el nombre de db en time de ejecución en kotlin
  • Propiedad no opcional con setter personalizado Kotlin
  • Cómo llamar al constructor String de Java (char , int offset, int length) de Kotlin?
  • Hacer reference a las vistas con la misma identificación en diferentes layouts con extensiones de android kotlin
  • cómo establecer el color de RecyclerView.ViewHolder en BroadcastReceiver.onReceive?
  • msg: ¿No se puede encontrar el getter para el atributo 'android: text' con el tipo de valor java.lang.String en el data binding?
  • Formateo de comentarios de Kotlin en IntelliJ / Android Studio
  • Android: comienza la animation cuando se carga el fragment
  • La configuration 'comstackr' está obsoleta, pero todas las configuraciones son 'implementación'
  • Kotlin - Transforma el valor en la initialization