提问人:Denis Sonozaki 提问时间:8/18/2023 更新时间:8/18/2023 访问量:84
如何使用 Hilt 注入源自挂起函数的依赖关系?
How to inject dependency originating from suspend function with Hilt?
问:
我正在尝试实现加密的 Rooms 数据库,并且在从 DataStore 获取加密密钥的方法中,我必须使用几个使方法本身挂起的挂起函数。但是我应该如何在 Dagger Hilt 模块中使用这种方法来获取密钥呢?
这是获取加密密钥的方法
suspend fun getDbKey(): CharArray {
context.dataBaseKeyDataStore.data.map {
it[PREFERENCES_KEY]
}.first()?.let {
return it.toCharArray()
}
val dbKey = createNewKey()
context.dataBaseKeyDataStore.edit {
it[PREFERENCES_KEY] = dbKey
}
return dbKey.toCharArray()
}
我需要用 Hilt 注入数据库 DAO,并且我必须在 Hilt offer 方法中调用 suspend 函数。
@InstallIn(SingletonComponent::class)
@Module
class FileDataBaseModule {
@Provides
@Singleton
fun provideChannelDao(fileDataBase: FileDataBase): MyFileDao {
return fileDataBase.myFileDao()
}
@Provides
@Singleton
fun provideAppDatabase(
@ApplicationContext context: Context,
databaseKeyStorage: DatabaseKeyStorage
): FileDataBase {
val dbKey = runBlocking { databaseKeyStorage.getDbKey() }
return FileDataBase.create(context, dbKey)
}
}
但是,我听到了很多反对在生产代码中使用 runBlocking 方法的警告,我不确定我是否正确地解决了这个问题。我真的应该使用 runBlocking{} 从挂起函数中获取值,还是有任何其他方法可以做我需要做的事情?
答: 暂无答案
评论