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

Tri*_*ixy 9 android dagger-hilt

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

以下是来自 github Repo 的代码示例,该示例未使用 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)
  }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试随机的东西来现场注入,就像 @AndroidEntryPoint/@EntryPoint 的注释一样,显然它不起作用。

Bar*_*ski 9

包含Moshi在 Hilt 依赖图中就像添加此类一样简单:

@Module
@InstallIn(ApplicationComponent::class)
object DataModule {

  @Singleton
  @Provides
  fun provideMoshi(): Moshi {
      return Moshi.Builder().build()
  }
}
Run Code Online (Sandbox Code Playgroud)

@TypeConverters用于Room数据库。如果你想使用希尔特的 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)
    }
}
Run Code Online (Sandbox Code Playgroud)
  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
  }
}
Run Code Online (Sandbox Code Playgroud)