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



我遵循本教程房间依赖注入-MVVM待办事项列表应用程序与流和架构组件#4

现在我想把我在Room上的一个洞应用程序转换成这个干净的架构。在教程中,Florian使用DI将TaskDao注入到TaskViewModel中,但我有一个存储库类。

因此,我达到了一个点,即应用程序的构建没有错误。

这是我的仓库:

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()
}
}

这是我的存储模块:

@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\ATMobileKt\app\build\generated\source\kapt\debug\com\cse\atm\ATMApplication_HiltComponents.java:155:错误:[Dagger/MissingBinding]@com.cse.atm.di.ApplicationScopekotlin.coroutines.CoroutineScope不能在没有@提供带注释的方法。公共抽象静态类SingletonC实现了ATApplication_GeneratedInjector,^@com.cse.atm.di.ApplicationScope kotlin.coroutines.CoroutineScope注入于com.cse.atm.database.ATMDatabase.Callback(�,applicationScope(com.cse.atm.database.ATMDatabase.Callback注入于com.cse.atm.di.AppModule.providesDatabase(�,回调(com.cse.atm.database.ATMDatabase注入于com.cse.atm.di.AppModule.providesAnioDao(db(com.cse.atm.database.AnioDao注入于com.cse.atm.di.RepositoryModule.providesAnioRepository(anioDao,�)javax.inject.Provider<com.cse.atm.data.AnioRepository>在处注入

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

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

任何帮助我们都将不胜感激!!

致以最诚挚的问候

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

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

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

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

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

最新更新