Я пользуюсь dagger-android, и столкнулся с такой же проблемой.
Решение заключается в создании базы данных приложений
@Provides @Reusable
fun provideDatabase(context: Context, moshi: Moshi): AppDatabase =
Room.databaseBuilder(...).build().apply { AppDatabase.moshi = moshi }
База данных приложений проста RoomDatabase:
@Database(
entities = [OrderEntity::class],
version = 1,
exportSchema = false
)
@TypeConverters(DbConverters::class)
abstract class AppDatabase : RoomDatabase() {
companion object {
lateinit var moshi: Moshi
}
abstract fun orderDao(): OrderDao
}
Затем используйте этот сопутствующий объект в конвертере:
class DbConverters {
@TypeConverter
fun orderInfoToString(orderInfo: OrderInfo?): String? =
AppDatabase.moshi.adapter(OrderInfo::class.java).toJson(orderInfo)
@TypeConverter
fun stringToOrderInfo(value: String): OrderInfo? =
AppDatabase.moshi.adapter(OrderInfo::class.java).fromJson(value)
}
Думаю, это выглядит ужасно, но работает. Возможно, использование статического / сопутствующего объекта с областью действия @Reuseable
- плохая идея.
Moshi, тем не менее, предоставляется с использованием @Singleton
scope в AppModule, так что в основном живут всю жизнь приложения