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