我遵循本教程房间依赖注入-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
正在请求具有自定义限定符@ApplicationScope
的CoroutineScope
,但您在任何模块中都没有提供这样的CoroutineScope
。
为了提供协同程序范围,您链接的教程在28分钟左右添加了以下代码:
@Provides
@Singleton
fun provideApplicationScope() = CoroutineScope(SupervisorJob())
由于在请求协程作用域时使用@ApplicationScope
限定符,因此还需要将限定符添加到此@Provides
方法中:
@Provides
@Singleton
@ApplicationScope
fun provideApplicationScope() = CoroutineScope(SupervisorJob())