【问题标题】:koin pass CoroutineScope as dependency for RoomDatabaseCallbackkoin 将 CoroutineScope 作为 RoomDatabaseCallback 的依赖项传递
【发布时间】:2019-05-17 09:27:33
【问题描述】:

我有一个需要 CoroutineScope 进行初始化的数据库。

@Database(entities = [Word::class], version = 1)
 abstract class WordRoomDatabase : RoomDatabase() {
abstract fun wordDao(): WordDao

 companion object {
@Volatile
private var INSTANCE: WordRoomDatabase? = null

fun getDatabase(
        context: Context,
        scope: CoroutineScope//this dependecy!!!
): WordRoomDatabase {
    return INSTANCE ?: synchronized(this) {
        val instance = Room.databaseBuilder(
                context.applicationContext,
                WordRoomDatabase::class.java,
                "word_database"
        )
                .addCallback(WordDatabaseCallback(scope))
                .build()
        INSTANCE = instance
        instance
    }
}

private class WordDatabaseCallback(
        private val scope: CoroutineScope
) : RoomDatabase.Callback() {
    override fun onOpen(db: SupportSQLiteDatabase) {
        super.onOpen(db)
        INSTANCE?.let { database ->
            scope.launch(Dispatchers.IO) {
                populateDatabase(database.wordDao())
            }
        }
    }
}
  suspend fun populateDatabase(wordDao: WordDao) {
    wordDao.deleteAll()
  }
}
} 

如何在模块中将我的 ViewModel 作为 CoroutineScope 传递?

val appModule = module {
  single <Dao>{ WordRoomDatabase.getInstance(get(),**dependency here
  Mymodel**).wordDao()}
  viewModel { MyModel(get(),get()) }
}

这个例子来自https://github.com/googlecodelabs/android-room-with-a-view/blob/kotlin/app/src/main/java/com/example/android/roomwordssample/WordRoomDatabase.kt 他们在 ViewModel 中初始化了数据库,但我不能这样做。我必须初始化 throw Koin 依赖注入 我花了两天时间尝试和试验,但没有任何成功。

【问题讨论】:

    标签: android android-room koin


    【解决方案1】:

    您还需要在您的appModule 中声明CoroutineScope

    val appModule = module {
      single <Dao>{ WordRoomDatabase.getInstance(get(),**dependency here
      Mymodel**).wordDao()}
      viewModel { MyModel(get(),get()) }
    
      factory { SupervisiorJob() }
      factory { CoroutineScope(Dispatchers.IO + get<SupervisorJob>()) }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2018-04-18
      • 1970-01-01
      • 2021-07-28
      • 2023-04-04
      • 2016-03-05
      • 2013-02-17
      • 1970-01-01
      • 1970-01-01
      • 2016-10-08
      相关资源
      最近更新 更多