我无法使用 HILT 在 Android 中将 Dao 注入存储库 Class

I can't inject Dao to a Repository Class, with HILT, in Android

我遵循这个教程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 class 添加到存储库 Class,如下所示:

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 时,我得到这个错误:

public abstract class ATMDatabase extends androidx.room.RoomDatabase { ^C:\pryectos\AndroidStudioProjects\ATMobileXKt\app\build\generated\source\kapt\debug\com\cse\atm\ATMApplication_HiltComponents.java:155: error: [Dagger/MissingBinding] @com.cse.atm.di.ApplicationScope kotlinx.coroutines.CoroutineScope cannot be provided without an @Provides-annotated method. public abstract static class SingletonC implements ATMApplication_GeneratedInjector, ^ @com.cse.atm.di.ApplicationScope kotlinx.coroutines.CoroutineScope is injected at com.cse.atm.database.ATMDatabase.Callback(�, applicationScope) com.cse.atm.database.ATMDatabase.Callback is injected at com.cse.atm.di.AppModule.providesDatabase(�, callback) com.cse.atm.database.ATMDatabase is injected at com.cse.atm.di.AppModule.providesAnioDao(db) com.cse.atm.database.AnioDao is injected at com.cse.atm.di.RepositoryModule.providesAnioRepository(anioDao, �) javax.inject.Provider<com.cse.atm.data.AnioRepository> is injected at

这个错误是什么意思?我缺少什么?

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

任何帮助将不胜感激!!

此致

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

为了提供协程作用域,您链接的教程在 28 分钟标记附近添加了以下代码:

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

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

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