Рукоятка дагера с базой данных Realm

#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 функции, передав a Context в качестве параметра и возвращая 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()