Подтвердить что ты не робот

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

Я новичок с Котлин и Даггер. У меня есть небольшая проблема, которую я не могу решить, и я не могу найти решение.

Итак, вот что у меня есть:

@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 тот же результат.

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

4b9b3361

Ответ 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