example kotlin dagger-2

kotlin - example - retrofit dagger



Dagger 2 métodos estáticos de proveedor en kotlin (3)

Aunque creo que la solución de zsmb13 es mejor, encontré otra solución que funciona

@Module class AModule { @Module companion object { @JvmStatic @Provides fun providesA(): A = A() } // add other non-static provides here }

Sin embargo, tenga en cuenta que habrá dos clases generadas: AModule_ProvidesAFactory y AModule_Companion_ProvidesAFactory lugar de la única clase AModule_ProvidesAFactory para el caso con un objeto en lugar de una clase con un objeto complementario

Con las versiones recientes de dagger 2, una de las mejoras realizadas es la posibilidad de tener métodos de suministro estáticos. Simplemente así:

@Provides static A providesA() { return A(); }

Me preguntaba ¿cómo se puede hacer esto en kotlin? He intentado

@Module class AModule { companion object { @JvmStatic @Provides fun providesA(): A = A() } }

Pero me sale el mensaje de error:

@Provides methods can only be present within a @Module or @ProducerModule

Supongo que aquí ocurre algo con el objeto complementario, sin embargo, soy bastante nuevo en Kotlin y no estoy seguro de cómo se puede hacer esto. ¿Es posible?

¡Gracias!


No puedo probarlo ahora, pero creo que esto debería funcionar:

@Module object AModule { @JvmStatic @Provides fun providesA(): A = A() }


Una gran explicación que parece estar aprobada por Google está en https://github.com/google/dagger/issues/900

Específicamente, mira:

La prestación estática se puede lograr a través de @JvmStatic. Hay dos escenarios en los que veo surgir esto:

object nivel superior

@Module object DataModule { @JvmStatic @Provides fun provideDiskCache() = DiskCache() }

Si tienes un módulo de clase existente, las cosas se ponen un poco más raras

@Module abstract class DataModule { @Binds abstract fun provideCache(diskCache: DiskCache): Cache @Module companion object { @JvmStatic @Provides fun provideDiskCache() = DiskCache() } }

La forma en que esto funciona es la siguiente:

el objeto complementario también debe anotarse como @Module debajo del capó, el compilador de kotlin duplicará los métodos de provisión estática en la clase DataModule. Dagger los verá y los tratará como campos estáticos regulares. Dagger también los verá en el objeto complementario, pero ese "módulo" obtendrá código gen de daga pero se marcará como "no utilizado". El IDE marcará esto como tal, ya que el método provideDiskCache se marcará como no utilizado. Puedes decirle a IntelliJ que ignore esto para las anotaciones anotadas con @Provides vía quickfix