Кинжал и Котлин. 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 класс не генерируется Dagger, если я сделаю этот DaggerAppComponent.builder().appModule(AppModule(app)).build() вызов в companion object. Если вызвать ту же строку с помощью companion object dagger, сгенерируйте de class без каких-либо проблем.

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

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


person Leo    schedule 19.12.2015    source источник
comment
у вас был kapt 'com.google.dagger:dagger-compiler:2.0.2' в build.gradle?   -  person Deividi Cavarzan    schedule 20.12.2015
comment
Follwing также может исправить эту проблему с помощью плагинов 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"   -  person Devishankar    schedule 13.12.2017


Ответы (5)


Вам необходимо иметь процессор 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'
    ...
}

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

person Deividi Cavarzan    schedule 20.12.2015
comment
где вы узнали о конфигурации generateStubs? мне не хватало этого бита, и, к счастью, я наткнулся на этот ответ. - person homerman; 13.08.2016
comment
Учитывалась ли последовательность элементов в dependencies? Сначала у меня не получилось, потому что compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" были добавлены в конец списка зависимостей. Затем я переместил его наверх, и все заработало. - person JuniperPhoton; 13.06.2017
comment
Follwing также может исправить эту проблему с помощью плагинов 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" - person Devishankar; 13.12.2017
comment
Если это проект Android на основе Java, что мы должны указать в файле Gradle? - person Ashok; 21.03.2019

Я не знаю, когда произошло это изменение, но в 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'
)
person Plumbus    schedule 28.04.2017
comment
спасибо, что нашли это только вчера: D у вас есть какой-нибудь источник для этого? как ты узнал? - person Giszmo; 29.04.2017
comment
Чтобы было понятно: apply plugin: 'kotlin-kapt' должен быть в вашем модуле build.gradle - person charlag; 18.07.2017
comment
Спасибо @charlag. Обновил ответ. - person Plumbus; 20.11.2017

ОБНОВЛЕНИЕ KOTLIN 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'
}
person solidak    schedule 12.10.2017

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

Следующее также поможет исправить эту проблему.

с плагинами

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.

person Devishankar    schedule 13.12.2017
comment
Удалось ли вам заставить это работать в проекте библиотеки Android? - person speedynomads; 13.03.2019
comment
Да @speedynomads - person Devishankar; 13.07.2019
comment
добавление kapt com.google.dagger: dagger-android-processor: 2. + кроме других для dagger у меня сработало. - person Saurabh Singh; 07.11.2020

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

apply plugin: 'kotlin-kapt'

kapt {
    generateStubs = true
}

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

person Minis    schedule 07.05.2017
comment
Работает. Не забудьте добавить kapt 'com.google.dagger:dagger-android-processor:2.14.1' и kapt 'com.google.dagger:dagger-compiler:2.14.1' в зависимости - person kosiara - Bartosz Kosarzycki; 16.01.2018
comment
Это устарело. - person cesards; 03.02.2021