如何使用 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,你将不得不尝试一下。一种方法是:
- 将
@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)
}
}
- 在创建 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
}
}
我正在试用 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,你将不得不尝试一下。一种方法是:
- 将
@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)
}
}
- 在创建 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
}
}