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?.
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
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'
)
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'
}
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
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