example kotlin dagger-2

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



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