UninitializedPropertyAccessException при использовании Hilt

Я получаю lateinit ошибку, но не вижу проблемы

 kotlin.UninitializedPropertyAccessException: lateinit property soldatDatabase has not been initialized
        at pl.rybson.soldatlobby.di.RoomModule.provideServersDao(RoomModule.kt:37)
        at pl.rybson.soldatlobby.di.RoomModule_ProvideServersDaoFactory.provideServersDao(RoomModule_ProvideServersDaoFactory.java:27)
        at pl.rybson.soldatlobby.DaggerBaseApplication_HiltComponents_ApplicationC.getServersDao(DaggerBaseApplication_HiltComponents_ApplicationC.java:113)
        at pl.rybson.soldatlobby.DaggerBaseApplication_HiltComponents_ApplicationC.getMainRepository(DaggerBaseApplication_HiltComponents_ApplicationC.java:127)
        at pl.rybson.soldatlobby.DaggerBaseApplication_HiltComponents_ApplicationC.access$1800(DaggerBaseApplication_HiltComponents_ApplicationC.java:53)
        at pl.rybson.soldatlobby.DaggerBaseApplication_HiltComponents_ApplicationC$SwitchingProvider.get(DaggerBaseApplication_HiltComponents_ApplicationC.java:431)
        at pl.rybson.soldatlobby.ui.home.HomeViewModel_AssistedFactory.create(HomeViewModel_AssistedFactory.java:24)
        at pl.rybson.soldatlobby.ui.home.HomeViewModel_AssistedFactory.create(HomeViewModel_AssistedFactory.java:12)

и Module.kt

@Module

@InstallIn (ApplicationComponent :: class) object RoomModule {

private lateinit var soldatDatabase: SoldatDatabase

@Singleton
@Provides
fun provideRoom(@ApplicationContext context: Context): SoldatDatabase {
    soldatDatabase = Room.databaseBuilder(
        context,
        SoldatDatabase::class.java,
        "soldat.db"
    )
        .build()
    return soldatDatabase
}


@Singleton
@Provides
fun provideServersDao(): ServersDao {
    return soldatDatabase.serversDao()
}

}


person edwinnurek    schedule 12.08.2020    source источник


Ответы (1)


Dagger создает зависимости только в том случае, если они необходимы. Поскольку provideServersDao не принимает аргументов, Даггер заключает, что ServersDao может быть предоставлено без каких-либо зависимостей, и нет причин для вызова provideRoom.

Поскольку ServersDao фактически зависит от экземпляра SoldatDatabase, вы должны попросить Dagger предоставить вам его:

@Module
@InstallIn(ApplicationComponent::class)
object RoomModule {

    @Singleton
    @Provides
    fun provideRoom(@ApplicationContext context: Context): SoldatDatabase {
        return Room.databaseBuilder(
            context,
            SoldatDatabase::class.java,
            "soldat.db"
        )
            .build()
    }


    @Singleton
    @Provides
    fun provideServersDao(soldatDatabase: SoldatDatabase): ServersDao {
        return soldatDatabase.serversDao()
    }

}
person Nitrodon    schedule 12.08.2020
comment
Аааа. Это правда. Спасибо! - person edwinnurek; 13.08.2020