android - 我无法在 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 中,我不知道问题出在哪里。
任何帮助将不胜感激!
此致
解决方案
您ATMDatabase.Callback
正在请求CoroutineScope
带有自定义限定符的 a @ApplicationScope
,但您没有CoroutineScope
在任何模块中提供这样的 a。
为了提供协程范围,您链接的教程在 28 分钟左右添加了以下代码:
@Provides
@Singleton
fun provideApplicationScope() = CoroutineScope(SupervisorJob())
由于您@ApplicationScope
在请求协程范围时使用了限定符,因此您还需要将限定符添加到此@Provides
方法中:
@Provides
@Singleton
@ApplicationScope
fun provideApplicationScope() = CoroutineScope(SupervisorJob())
推荐阅读
- php - 如何在php中从第一个开始重新启动循环
- python - 线程之间共享列表的替代方案(多处理)
- javascript - 如果属性设置为是,则显示文本 - Magento 1
- c# - 如何在 C# 中选择嵌套列表及其祖先?
- wpf - 如何从 DataGrid 中的“SelectedItem”获取组合框值
- dolphindb - 删除分区表
- c# - 将 unity apk 安装到 android 图标后显示 twisely
- java - Sling Starter 的 OSGI 依赖项作为 Maven 依赖项?
- php - 如何将数据从 MySQL 导出到 CSV?
- javascript - 是否仅对提交按钮更正了我的 ajax 调用和 jQuery PHP?