Я новичок в 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' )
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