koin передает CoroutineScope в качестве зависимости для RoomDatabaseCallback - PullRequest
0 голосов
/ 17 мая 2019

У меня есть база данных, для инициализации которой требуется 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, но я не могу этого сделать.Я должен инициализировать инъекцию зависимости Коина, которую я провожу два дня, пытаясь и экспериментируя, но безуспешно.

1 Ответ

1 голос
/ 03 июля 2019

Вам также нужно объявить CoroutineScope в вашем appModule

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

  factory { SupervisiorJob() }
  factory { CoroutineScope(Dispatchers.IO + get<SupervisorJob>()) }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...