【问题标题】:Unresolved reference: DaggerApplicationComponent未解决的参考:DaggerApplicationComponent
【发布时间】:2021-10-25 18:56:00
【问题描述】:

出于某种原因,Dagger 不会为我的组件生成 DaggerApplicationComponent。我尝试过:重建、清理、使缓存失效、重新启动 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()
}

【问题讨论】:

  • 你能展示你的应用代码吗?
  • 添加到原帖
  • 我想你忘了在build.gradle 文件中添加kapt 'com.google.dagger:dagger-compiler:2.x

标签: android dependency-injection dagger-2


【解决方案1】:

由于您使用的是Dagger Android,看来您将app模块注入应用程序的方式是错误的。

请更正如下:

在app组件中,应该从AndroidInjector扩展,具体如下:

app_component.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)
    }
}

最后,您应该清理并重建您的项目。

还有一件事,确保添加所有 Dagger android 库。

app build.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")
}

【讨论】:

  • 非常感谢。我不知道有两个版本:标准版和安卓版。我将我的匕首实施替换为标准实施,现在一切正常!我现在应该尝试切换到 android 特定版本吗?
  • @EvgenyYurin 有了安卓版本,Dagger 会更好地支持安卓。您可以将原始版本替换为 Android 版本。或者另一个选择是 Hilt。它比 Dagger 更简单,并且很好地支持 Android 组件,如内容提供程序、服务……。你应该试试 Hilt。更多信息:Hilt
猜你喜欢
  • 2016-12-14
  • 1970-01-01
  • 1970-01-01
  • 2019-04-05
  • 1970-01-01
  • 2021-08-17
  • 2020-05-27
  • 2019-11-16
  • 2021-01-24
相关资源
最近更新 更多