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

问题描述

我正在尝试暂停,我想注入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就像添加此类一样简单:

@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
  }
}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...