#android #kotlin #dependency-injection #realm #dagger-hilt
Вопрос:
Кто-нибудь использовал рукоятку кинжала с базой данных Realm. У меня проблема с инициализацией. Возможно, вышеприведенное решение сработает.
Ошибка ->
Модули, которые необходимо создать с помощью Hilt, должны иметь видимый пустой конструктор. Обработка [рукояти] не завершена. Подробности см. в разделе Ошибка выше. Не удалось выполнить задачу»: приложение:kaptDebugKotlin». При выполнении org.jetbrains произошел сбой.kotlin.gradle.внутренний.KaptExecution java.язык.отражение.Исключение InvocationTargetException (без сообщения об ошибке)`
Мой модуль ->
@Module
@InstallIn(SingletonComponent::class)
class LocalDataSourceModule(context: Context) {
init {
Realm.init(context)
}
@Provides
fun provideLocalDataSource(realm: Realm): LocalDataSource = LocalDataSourceImpl(realm)
@Singleton
@Provides
fun provideRealm(configuration: RealmConfiguration): Realm =
try {
Realm.getDefaultInstance()
} catch (e: Exception) {
Realm.getInstance(configuration)
}
@Singleton
@Provides
fun provideRealmConfiguration(): RealmConfiguration = RealmConfiguration.Builder().build()
}
Мое приложение ->
@HiltAndroidApp
class BaseApplication : Application() {
lateinit var girlComponent: GirlComponent
private set
override fun onCreate() {
super.onCreate()
Timber.plant(Timber.DebugTree())
girlComponent = DaggerGirlComponent.builder().localDataSourceModule(
LocalDataSourceModule(applicationContext)
).build()
}
}
Комментарии:
1. Никогда не использовал Hilt, но ошибка в том, что в вашем модуле нет конструктора без аргументов, которого у него нет. В модуле удалите аргумент конструктора и либо в области инициализации в другом месте, либо в
provideRealm
функции, передав aContext
в качестве параметра и возвращаяRealm
, как и любую другую зависимость, которую вы создали бы.2. затем я получаю ошибку: методы @Provides должны возвращать значение (не void) public final void provideRealmContext(@org.jetbrains.аннотации. NotNull()
Ответ №1:
Я думаю, что это может сработать. Рукоять может вводить контекст приложения. Проверка @ApplicationContext
import android.content.Context
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import io.realm.Realm
import io.realm.RealmConfiguration
import javax.inject.Singleton
@InstallIn(SingletonComponent::class)
@Module
object RealmModule {
@Provides
@Singleton
fun providesRealmDatabase(
@ApplicationContext context: Context
): Realm {
Realm.init(context)
val realmConfiguration = RealmConfiguration
.Builder()
.name("Tsavo Project")
.build()
Realm.setDefaultConfiguration(realmConfiguration)
return Realm.getDefaultInstance()
}
}
Ответ №2:
@Singleton
@Provides
fun provideRealm(@ApplicationContext context: Context): Realm =
try {
Realm.init(context)
Realm.getDefaultInstance()
} catch (e: Exception) {
Realm.getInstance(provideRealmConfig())
}
private fun provideRealmConfig(): RealmConfiguration = RealmConfiguration.Builder().build()