Dagger et Kotlin. Dagger ne génère pas de classes de composants
je suis nouveau avec kotlin et Dagger. J'ai un petit problème que je ne sais pas comment résoudre et je ne trouve pas une solution.
donc c'est ce que j'ai
@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
: Cette interface contient toutes les méthodes nécessaires par ce composant.
Maintenant, le problème est que ce DaggerAppComponent
classe n'est pas généré par la Dague si je fais ceci DaggerAppComponent.builder().appModule(AppModule(app)).build()
invocation dans le companion object
.
Si un invoquer la même ligne tous étaient par le companion object
dague générez de class sans aucun problème.
une autre chose que j'ai cherché une solution était de créer une autre classe différente avec la même structure, et d'importer le DaggerAppComponent
comme objet interne, et je le même résultat s'est produit.
je ne sais pas ce que pour avoir l'initialisation du composant à l'extérieur. Alors, il y a une autre solution, ou qu'est-ce que je fais de mal?.
6 réponses
vous devez avoir le processeur kapt dans la construction.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'
...
}
cette extension générera le code pour dagger.
de plus, pour les nouvelles versions gradle, vous pouvez également appliquer le plugin dans votre construction.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'
...
}
Vous pouvez vérifier l' ce projet pour référence
Je ne sais pas quand ce changement est arrivé, mais sur le 1.1.2 du plugin Kotlin gradle vous remplacez ceci (dans votre module build.gradle
):
kapt {
generateStubs = true
}
avec ceci:
apply plugin: 'kotlin-kapt'
et puis assurez-vous de remplacer les dépendances qui utilisent annotationProcessor
kapt
.
Par exemple, l'ancienne voie consisterait à utiliser:
annotationProcessor (
'some.library:one:1.0'
...
'some.library.n:n.0'
)
et maintenant, vous utilisez:
kapt (
'some.library:one:1.0'
...
'some.library.n:n.0'
)
MISE À JOUR POUR KOTLIN 1.1.4
generateStubs
ne fonctionne plus. N'hésitez pas à faire une construction avec le dernier Kotlin et il vous dirait dans le Messages section D'Android Studio que ce n'est plus nécessaire. Voici une liste à jour des dépendances Dagger2 pour Android et 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'
}
Si vous avez des problème avec DaggerComponent
, Vous devez ajouter
apply plugin: 'kotlin-kapt'
kapt {
generateStubs = true
}
build.gradle
il générera kotlin
code pour dagger 2
sinon le projet ne s'appuiera que sur Rebuild
ce problème peut être corrigé avec le changement de cloche qui est différent de la réponse originale
la suite fonctionnera aussi bien pour corriger ce problème
avec des plugins
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
et les dépendances
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"
Pour la vérification des références dans cette Gist
j'ai créé des kata pour apprendre à reformater une application avec Kotlin https://github.com/xurxodev/Movies-Kotlin-Kata
Un kata est sur le Poignard et C'est résolu pour moi dans la branche principale https://github.com/xurxodev/Movies-Kotlin-Kata/tree/kata_di_movies
pour mieux comprendre le but de ce dépôt GitHub j'ai écrit un article moyen https://proandroiddev.com/learn-kotlin-refactoring-an-app-38cf0cbefe6c