web-dev-qa-db-fra.com

Dague 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 n'arrive pas à résoudre et je ne trouve pas de solution.

Voici donc 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 à ce composant.

Maintenant, le problème est que cette classe DaggerAppComponent n'est pas générée par Dagger si je fais cette invocation DaggerAppComponent.builder().appModule(AppModule(app)).build() dans le companion object. Si un appel de la même ligne en a été un par la dague companion object, Générer de la classe 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 importe le DaggerAppComponent comme objet interne, et le même résultat s'est produit.

Je ne sais pas quoi avoir l'initialisation du composant à l'extérieur. Alors, y a-t-il une autre solution alternative, ou qu'est-ce que je fais mal?.

36
Leo

Vous devez avoir le processeur kapt dans 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'
    ...
}

Cette extension générera le code de la dague.

De plus, pour les versions plus récentes de Gradle, vous pouvez également appliquer le plugin dans votre 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'
    ...
}

Vous pouvez vérifier ce projet pour référence

88
Deividi Cavarzan

Je ne sais pas quand ce changement s'est produit, mais sur 1.1.2 du plugin Kotlin gradle vous le remplacez (dans build.gradle De votre module):

kapt {
    generateStubs = true
}

avec ça:

apply plugin: 'kotlin-kapt'

puis assurez-vous de remplacer les dépendances qui utilisent annotationProcessor par kapt.

Par exemple, l'ancienne façon serait d'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'
)
19
Plumbus

MISE À JOUR POUR KOTLIN 1.1.4

generateStubs ne fonctionne plus. N'hésitez pas à faire une construction avec la dernière Kotlin et cela vous dirait dans la section Messages de Android Studio que ce n'est plus nécessaire. Voici une liste à jour des dépendances pour 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'
}
12
Solidak

Ce problème peut être résolu avec le changement ci-dessous qui est différent de la réponse d'origine

Ce qui suit fonctionnera également bien pour résoudre ce problème

avec des plugins

apply plugin: 'kotlin-Android'
apply plugin: 'kotlin-kapt'

et 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 référence, consultez ce Gist

4
Devishankar

Si vous avez un problème avec DaggerComponent, vous devez ajouter

apply plugin: 'kotlin-kapt'

kapt {
    generateStubs = true
}

à build.gradle il générera un code kotlin pour dagger 2 sinon le projet ne s'appuiera que sur Rebuild

0
Minis