#android #dependency-injection #dagger-2
Вопрос:
По какой-то причине Dagger не генерирует компонент daggerapplication для моего компонента. Я пробовал: восстановление, очистка, аннулирование кэша, перезапуск Android Studio и т. Д. У меня ничего не получалось. Вот полный код:
Модули
@Module
class AppModule {
@Provides
@Singleton
fun provideContext(): Context = provideContext()
}
@Module
class DatabaseModule {
@Provides
@Singleton
open fun provideRoom(context: Context): RoomDatabase =
Room.databaseBuilder(
context,
AppDatabase::class.java,
DATABASE_NAME
).build()
}
@Module
class NetworkModule {
private val json = Json { ignoreUnknownKeys = true }
private val client = OkHttpClient.Builder()
.addInterceptor(TokenInterceptor)
.build()
@Provides
@Singleton
open fun provideRetrofit(): Retrofit =
Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(json.asConverterFactory("application/json".toMediaType()))
.client(client)
.build()
}
Компонент
@Singleton
@Component(modules = [AppModule::class, DatabaseModule::class, NetworkModule::class])
interface ApplicationComponent {
fun inject(defaultRepository: DefaultRepository)
fun inject(myApplication: MyApplication)
}
Также в файле build.gradle я использую
implementation 'com.google.dagger:dagger-android:2.35.1'
implementation 'com.google.dagger:dagger-android-support:2.35.1' // if you use the support libraries
kapt 'com.google.dagger:dagger-android-processor:2.35.1'
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlinx-serialization'
id 'kotlin-kapt'
}
Приложение
class MyApplication : Application() {
val myApplication = DaggerApplicationComponent.builder().build()
}
Комментарии:
1. Можете ли вы показать свой код приложения?
2. Добавил его в исходное сообщение
3. Я думаю, вы забыли добавить
kapt 'com.google.dagger:dagger-compiler:2.x
вbuild.gradle
файл
Ответ №1:
Поскольку вы используете Dagger Android, кажется, что способ, которым вы вводите модуль приложения в приложение, неправильный.
Пожалуйста, исправьте это следующим образом:
В компоненте приложения вы должны расширить AndroidInjector
, в частности , следующим образом:
app_компонент.kt
@Singleton
@Component(modules = [AppModule::class, DatabaseModule::class, NetworkModule::class])
interface ApplicationComponent : AndroidInjector<MyApplication> {
@Component.Factory
abstract class Factory : AndroidInjector.Factory<MyApplication>
}
Следующее MyApplication
. Когда вы используете dagger android, вы должны расширить DaggerApplication()
его . Именно так:
my_application.kt
class MyApplication : DaggerApplication() {
override fun applicationInjector(): AndroidInjector<out DaggerApplication> {
return DaggerAppComponent.factory().create(this)
}
}
И, наконец, вы должны очистить и перестроить свой проект.
И еще одно, убедитесь, что вы добавили все библиотеки Android Dagger.
сборка приложения.gradle.kts
plugins {
id("kotlin-kapt")
}
dependencies {
implementation("com.google.dagger:dagger:2.37")
implementation("com.google.dagger:dagger-android:2.37")
implementation("com.google.dagger:dagger-android-support:2.37")
kapt("com.google.dagger:dagger-android-processor:2.37")
kapt("com.google.dagger:dagger-compiler:2.37")
}
Комментарии:
1. Большое вам спасибо. Я не знал, что есть две версии: стандартная и для Android. Я заменил свою реализацию кинжала на стандартную, и теперь все работает хорошо! Должен ли я попробовать сейчас переключиться на конкретную версию Android?
2. @EvgenyYurin С версией для Android, Dagger будет лучше поддерживать Android. Вы можете заменить исходную версию версией для Android. Или другой вариант-Рукоять. Это проще, чем Dagger, и хорошо поддерживает такие компоненты Android, как контент-провайдер, сервис,…. Тебе стоит попробовать Хилт. Дополнительная информация: Рукоять