Кинжал и Котлин. Кинжал не генерирует классы компонентов
Я новичок с Котлин и Даггер. У меня есть небольшая проблема, которую я не могу решить, и я не могу найти решение.
Итак, вот что у меня есть:
@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
не генерируется Dagger, если я делаю этот DaggerAppComponent.builder().appModule(AppModule(app)).build()
в companion object
. Если вызвать одну и ту же строку, то любой другой companion object
кинжала companion object
сгенерирует de class без проблем.
Еще одна вещь, которую я искал для решения - это создать другой класс с той же структурой и импортировать DaggerAppComponent
как внутренний объект, и у меня DaggerAppComponent
тот же результат.
Мне не нужно, чтобы инициализация компонента была снаружи. Итак, есть ли другое альтернативное решение, или я что-то не так делаю?
Ответы
Ответ 1
Вам нужно иметь процессор 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'
...
}
Это расширение будет генерировать код для кинжала.
Кроме того, для более новых версий gradle вы также можете применить плагин в вашем 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'
...
}
Вы можете проверить этот проект для справки
Ответ 2
Я не знаю, когда это изменение произошло, но в 1.1.2 плагина Kotlin gradle вы замените это (в своем модуле 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'
)
Ответ 3
ОБНОВЛЕНИЕ ДЛЯ КОТЛИНА 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'
}
Ответ 4
Эта проблема может быть исправлена с помощью следующего изменения, которое отличается от исходного ответа
Следующее будет также хорошо работать, чтобы исправить эту проблему.
с плагинами
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
Ответ 5
Если у есть проблема с DaggerComponent
, вы должны добавить
apply plugin: 'kotlin-kapt'
kapt {
generateStubs = true
}
до build.gradle
он сгенерирует kotlin
код для dagger 2
, иначе проект будет строиться только на Rebuild
Ответ 6
Я создал ката, чтобы узнать, как реорганизовать приложение с Kotlin
https://github.com/xurxodev/Movies-Kotlin-Kata
Одна ката - о кинжале, и она разрешена для меня в мастер-ветке
https://github.com/xurxodev/Movies-Kotlin-Kata/tree/kata_di_movies
Чтобы лучше понять цель этого репозитория GitHub, я написал статью Medium
https://proandroiddev.com/learn-kotlin-refactoring-an-app-38cf0cbefe6c