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()
}

}

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()
    }

}
Другие вопросы по тегам