example - Daga y Kotlin. Daga no genera clases de componentes.
retrofit dagger (6)
ACTUALIZACIÓN PARA KOTLIN 1.1.4
generateStubs
ya no funciona. Siéntase libre de hacer una compilación con el último Kotlin y le diría en la sección de Mensajes de Android Studio que ya no es necesario. Aquí hay una lista actualizada de dependencias para Dagger2 para Android y Kotlin
apply plugin: ''kotlin-kapt''
//...
// Other Gradle stuff
//...
dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:1.1.4-3"
compile ''com.google.dagger:dagger-android:2.12''
kapt ''com.google.dagger:dagger-android-processor:2.12''
compileOnly ''com.google.dagger:dagger:2.12''
kapt ''com.google.dagger:dagger-compiler:2.12''
}
Soy nuevo con Kotlin y Dagger. Tengo un pequeño problema que no tengo como resolver y no encuentro una solución.
Así que esto es lo que tengo
@Module
class AppModule (app: Application) {
private var application: Application;
init {
this.application = app;
}
@Provides fun provideApplication(): Application? {
return application;
}
@Provides fun provideResources(): Resources? {
return application.resources;
}
}
@Singleton
@Component(modules = arrayOf(AppModule::class))
interface AppComponent: AppComponentBase {
public class Initializer {
private constructor(){}
companion object {
fun Init(app: Application): AppComponent? {
return DaggerAppComponent.builder().appModule(AppModule(app)).build()
}
}
}
}
AppComponentBase
: esta interfaz contiene todos los métodos necesarios para este componente.
Ahora, el problema es que DaggerAppComponent
no genera esta clase DaggerAppComponent
si hago esta DaggerAppComponent.builder().appModule(AppModule(app)).build()
dentro del companion object
. Si se invoca la misma línea, cualquiera de los dos es el companion object
dagger genera de clase sin ningún problema.
Otra cosa en la que DaggerAppComponent
una solución fue crear otra clase diferente con la misma estructura e DaggerAppComponent
el DaggerAppComponent
como objeto interno, y sucedió el mismo resultado.
No tengo que tener la inicialización del componente exterior. Entonces, ¿hay alguna otra solución alternativa, o qué estoy haciendo mal?
Este problema se puede solucionar con el siguiente cambio que es diferente de la respuesta original
Lo siguiente también funcionará bien para solucionar este problema
con plugins
apply plugin: ''kotlin-android''
apply plugin: ''kotlin-kapt''
y dependencias
implementation "com.google.dagger:dagger:$dagger_version"
implementation "com.google.dagger:dagger-android:$dagger_version"
implementation "com.google.dagger:dagger-android-support:$dagger_version"
kapt "com.google.dagger:dagger-compiler:$dagger_version"
kapt "com.google.dagger:dagger-android-processor:$dagger_version"
Para referencia echa un vistazo a este Gist
He creado katas para aprender a refactorizar una aplicación con Kotlin https://github.com/xurxodev/Movies-Kotlin-Kata
Un kata es sobre Dagger y está resuelto para mí en la rama maestra https://github.com/xurxodev/Movies-Kotlin-Kata/tree/kata_di_movies
Para comprender mejor el objetivo de este repositorio de GitHub, escribí un artículo de Medio https://proandroiddev.com/learn-kotlin-refactoring-an-app-38cf0cbefe6c
Necesitas tener el procesador kapt en build.gradle:
kapt {
generateStubs = true
}
dependencies {
...
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
compile ''com.google.dagger:dagger:2.0.2''
kapt ''com.google.dagger:dagger-compiler:2.0.2''
...
}
Esta extensión generará el código para daga.
Además, para las versiones más recientes de Gradle, también puede aplicar el complemento en su build.gradle:
apply plugin: ''kotlin-kapt''
dependencies {
...
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
compile ''com.google.dagger:dagger:2.0.2''
kapt ''com.google.dagger:dagger-compiler:2.0.2''
...
}
Puedes consultar este proyecto para referencia.
No sé cuándo sucedió este cambio, pero en 1.1.2 del plugin Kotlin gradle reemplaza este (en build.gradle
su módulo):
kapt {
generateStubs = true
}
con este:
apply plugin: ''kotlin-kapt''
y luego asegúrese de reemplazar las dependencias que usan annotationProcessor
con kapt
.
Por ejemplo, la forma antigua sería usar:
annotationProcessor (
''some.library:one:1.0''
...
''some.library.n:n.0''
)
y ahora usas:
kapt (
''some.library:one:1.0''
...
''some.library.n:n.0''
)
Si tienes problemas con DaggerComponent
, deberías agregar
apply plugin: ''kotlin-kapt''
kapt {
generateStubs = true
}
para build.gradle
generará el código kotlin
para la dagger 2
contrario el proyecto solo se construirá en Rebuild