Кинжал и Котлин. Кинжал не генерирует классы компонентов

Я новичок в kotlin и Dagger. У меня есть небольшая проблема, что я не решаю, и я не нахожу решение.

Так вот что я имею

@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 : этот интерфейс содержит все методы, необходимые для этого компонента.

Проблема заключается в том, что этот класс DaggerAppComponent не создается кинжалом, если я делаю это приложение DaggerAppComponent.builder().appModule(AppModule(app)).build() внутри companion object . Если вызывающая одна и та же линия какая-либо из них была companion object кинжалом- companion object сгенерируйте класс без каких-либо проблем.

Другое дело, что я искал решение, – это создать другой класс с той же структурой и импортировать DaggerAppComponent качестве внутреннего объекта, и я DaggerAppComponent тот же результат.

Я не хочу, чтобы инициализация компонента была нарушена. Итак, есть ли другое альтернативное решение, или что я делаю неправильно?

Вы должны иметь процессор kapt в файле 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' ... } 

Это расширение будет генерировать код для кинжала.

Вы можете проверить этот проект для справки

Я не знаю, когда это изменение произошло, но в 1.1.2 плагина градиента Kotlin вы замените это (в build.gradle вашего модуля):

 kapt { generateStubs = true } 

с этим:

 apply plugin: 'kotlin-kapt' 

а затем обязательно замените зависимости, которые используют annotationProcessor с kapt .

Например, старый способ:

 annotationProcessor ( 'some.library:one:1.0' ... 'some.library.n:n.0' ) 

и теперь вы используете:

 kapt ( 'some.library:one:1.0' ... 'some.library.n:n.0' ) 

ОБНОВЛЕНИЕ ДЛЯ КОТЛИНА 1.1.4

generateStubs больше не работает. Не стесняйтесь делать сборку с последним Kotlin, и она сообщит вам в разделе « Сообщения » Android Studio, что больше не нужно. Вот обновленный список зависимостей для Dagger2 для Android и 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' } 

Если у вас проблема с DaggerComponent , вы должны добавить

 apply plugin: 'kotlin-kapt' kapt { generateStubs = true } 

для build.gradle он будет генерировать код kotlin для dagger 2 иначе проект будет строиться только на Rebuild

Я создал ката, чтобы узнать, как реорганизовать приложение с помощью Kotlin https://github.com/xurxodev/Movies-Kotlin-Kata

Одна ката относится к кинжалу и разрешена для меня в мастер-ветке https://github.com/xurxodev/Movies-Kotlin-Kata/tree/kata_di_movies

Чтобы лучше понять цель этого репозитория GitHub, я написал статью «Средняя статья» https://proandroiddev.com/learn-kotlin-refactoring-an-app-38cf0cbefe6c

Эта проблема может быть исправлена ​​с помощью следующего изменения, которое отличается от исходного ответа

Следующее будет также хорошо работать, чтобы исправить эту проблему

с плагинами

 apply plugin: 'kotlin-android' apply plugin: 'kotlin-kapt' 

и зависимости

 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" 

Для справки ознакомьтесь с этим Gist