如何使用 Hilt 在 Room TypeConvertor 中注入 Moshi/Gson?

How to Inject Moshi/Gson in Room TypeConvertors using Hilt?

我正在试用 hilt,我想注入 moshi 以进行序列化和反序列化。

这是来自 github Repo 的代码 sample,它没有使用 di:

open class InfoTypeConverter {

private val moshi = Moshi.Builder().build() //not using dependency injection

  @TypeConverter
  fun fromString(value: String): PokemonInfo.Type? {
    val adapter: JsonAdapter<PokemonInfo.Type> = moshi.adapter(PokemonInfo.Type::class.java)
    return adapter.fromJson(value)
  }

  @TypeConverter
  fun fromInfoType(type: PokemonInfo.Type): String {
    val adapter: JsonAdapter<PokemonInfo.Type> = moshi.adapter(PokemonInfo.Type::class.java)
    return adapter.toJson(type)
  }
}

我正在尝试使用@AndroidEntryPoint/@EntryPoint 进行随机注入,就像注解一样,显然它不起作用。

在 Hilt 依赖关系图中包含 Moshi 就像添加此 class:

一样简单
@Module
@InstallIn(ApplicationComponent::class)
object DataModule {

  @Singleton
  @Provides
  fun provideMoshi(): Moshi {
      return Moshi.Builder().build()
  }
}

@TypeConverters 用于 Room 数据库。如果你想为他们使用 Hilt 的 Moshi,你将不得不尝试一下。一种方法是:

  1. @TypeConverter 函数放入带有初始化程序的静态上下文(object 声明)
object InfoTypeConverter {

    private lateinit var moshi: Moshi

    fun initialize(moshi: Moshi){
        this.moshi = moshi
    }

    
    @TypeConverter
    fun fromString(value: String): PokemonInfo.Type? {
      val adapter: JsonAdapter<PokemonInfo.Type> = moshi.adapter(PokemonInfo.Type::class.java)
      return adapter.fromJson(value)
    }

    @TypeConverter
    fun fromInfoType(type: PokemonInfo.Type): String {
      val adapter: JsonAdapter<PokemonInfo.Type> = moshi.adapter(PokemonInfo.Type::class.java)
      return adapter.toJson(type)
    }
}
  1. 在创建 RoomDatabase 之前初始化 InfoTypeConverter(此处使用相同的模块):
@Module
@InstallIn(ApplicationComponent::class)
object DataModule {

  @Singleton
  @Provides
  fun provideMoshi(): Moshi {
      return Moshi.Builder().build()
  }

  @Singleton
  @Provides
  fun provideRoomDatabase(moshi: Moshi): YourDatabase {
      InfoTypeConverter.initialize(moshi)
      val yourDatabase: YourDatabase = /* create your room database here */
      return yourDatabase
  }
}