Неразрешенная ссылка: DaggerApplicationКомпонент

#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, как контент-провайдер, сервис,…. Тебе стоит попробовать Хилт. Дополнительная информация: Рукоять