首页 > 解决方案 > 我无法在 Android 中使用 HILT 将 Dao 注入到存储库类

问题描述

我遵循本教程Room Dependency Injection - MVVM To-Do List App with Flow and Architecture Components #4

现在我想将我在 Room 中的一个洞应用程序转换为这个 Clean Architecture。在教程中 Florian 使用 DI 将 TaskDao 注入 TaskViewModel,但我有一个 Repositories 类。

所以我达到了应用程序构建没有错误的地步。

这是我的存储库:

    class AnioRepository constructor(
        private val agrotrackerApi: AgrotrackerApi
    ) {
    val TAG = "AnioRepository"
    //val anioDao: AnioDao

    fun downloadAnios(): AniosResponse? {
        GlobalScope.launch(Dispatchers.IO) {
            val result = agrotrackerApi.getAnios()
            if (result.isSuccessful) {
                for (anio in result.body()!!){
                    Log.d(TAG, anio.toString())
                }
            }
        }
        return null
    }

    fun getAnios() {
        //anioDao.getListAnios()
    }

    }

这是我的 RepositoryModule:

@Module
@InstallIn(ApplicationComponent::class)
object RepositoryModule {

    @Singleton
    @Provides
    fun providesAnioRepository( agrotrackerApi: AgrotrackerApi) : AnioRepository {
        return AnioRepository(agrotrackerApi)
    }

}

所以我正在尝试将 Dao 类添加到 Repository 类,如下所示:

class AnioRepository constructor(
        private val anioDao: AnioDao,
        private val agrotrackerApi: AgrotrackerApi
    ) {
    val TAG = "AnioRepository"
   ...

然后,更改 RepositoryModule,以匹配构造函数...

...
    fun providesAnioRepository( anioDao: AnioDao, agrotrackerApi: AgrotrackerApi) : AnioRepository 
        =  AnioRepository(anioDao, agrotrackerApi)
...

但是当我按下 Ctrl-F9 时,我得到了这个错误:

公共抽象类 ATMDatabase 扩展 androidx.room.RoomDatabase { ^C:\pryectos\AndroidStudioProjects\ATMobileXKt\app\build\generated\source\kapt\debug\com\cse\atm\ATMApplication_HiltComponents.java:155:错误:[Dagger/ MissingBinding] @com.cse.atm.di.ApplicationScope kotlinx.coroutines.CoroutineScope 不能在没有 @Provides-annotated 方法的情况下提供。公共抽象静态类 SingletonC 实现 ATMApplication_GeneratedInjector,^@com.cse.atm.di.ApplicationScope kotlinx.coroutines.CoroutineScope 在 com.cse.atm.database.ATMDatabase.Callback(�, applicationScope) com.cse.atm.database 注入.ATMDatabase.Callback 在 com.cse.atm.di.AppModule.providesDatabase(�, callback) 处注入 com.cse.atm.database.ATMDatabase 在 com.cse.atm.di.AppModule.providesAnioDao(db) com 处注入.cse.atm.database.AnioDao 在 com.cse.atm 注入。

这个错误是什么意思?我错过了什么?

@ApplicationScope 注释在另一个 AppModule.kt 中,我不知道问题出在哪里。

任何帮助将不胜感激!

此致

标签: androiddependency-injectiondagger-hilt

解决方案


ATMDatabase.Callback正在请求CoroutineScope带有自定义限定符的 a @ApplicationScope,但您没有CoroutineScope在任何模块中提供这样的 a。

为了提供协程范围,您链接的教程在 28 分钟左右添加了以下代码:

@Provides
@Singleton
fun provideApplicationScope() = CoroutineScope(SupervisorJob())

由于您@ApplicationScope在请求协程范围时使用了限定符,因此您还需要将限定符添加到此@Provides方法中:

@Provides
@Singleton
@ApplicationScope
fun provideApplicationScope() = CoroutineScope(SupervisorJob())

推荐阅读