我无法使用 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
正在请求带有自定义限定符 @ApplicationScope
的 CoroutineScope
,但您没有在任何模块中提供这样的 CoroutineScope
。
为了提供协程作用域,您链接的教程在 28 分钟标记附近添加了以下代码:
@Provides
@Singleton
fun provideApplicationScope() = CoroutineScope(SupervisorJob())
由于您在请求协程作用域时使用了 @ApplicationScope
限定符,因此您还需要将限定符添加到此 @Provides
方法中:
@Provides
@Singleton
@ApplicationScope
fun provideApplicationScope() = CoroutineScope(SupervisorJob())
我遵循这个教程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
正在请求带有自定义限定符 @ApplicationScope
的 CoroutineScope
,但您没有在任何模块中提供这样的 CoroutineScope
。
为了提供协程作用域,您链接的教程在 28 分钟标记附近添加了以下代码:
@Provides
@Singleton
fun provideApplicationScope() = CoroutineScope(SupervisorJob())
由于您在请求协程作用域时使用了 @ApplicationScope
限定符,因此您还需要将限定符添加到此 @Provides
方法中:
@Provides
@Singleton
@ApplicationScope
fun provideApplicationScope() = CoroutineScope(SupervisorJob())