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?.

28
demandé sur Deividi Cavarzan 2015-12-20 01:31:03

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

63
répondu Deividi Cavarzan 2018-04-14 05:18:02

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 annotationProcessorkapt.

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'
)
17
répondu Plumbus 2017-10-24 00:55:52

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'
}
9
répondu Solidak 2017-10-12 14:48:58

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

1
répondu Minis 2017-05-07 10:45:07

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

1
répondu Devishankar 2017-12-13 15:33:12

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

0
répondu xurxodev 2017-08-02 12:21:18