如何使用 Hilt 注入源自挂起函数的依赖关系?

How to inject dependency originating from suspend function with Hilt?

提问人:Denis Sonozaki 提问时间:8/18/2023 更新时间:8/18/2023 访问量:84

问:

我正在尝试实现加密的 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{} 从挂起函数中获取值,还是有任何其他方法可以做我需要做的事情?

异步 android-room kotlin-coroutines dagger-hilt

评论


答: 暂无答案