6

我正在尝试刀柄,我想注入 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)
  }
}

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

4

1 回答 1

5

包括Moshi在 Hilt 依赖图中就像添加这个类一样简单:

@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. InfoTypeConverter在创建 RoomDatabase 之前初始化(这里使用相同的模块):
@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
  }
}
于 2020-08-14T12:49:47.660 回答