0

Im getting lateinit error but I dont see the issue

 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)

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

}
Ace
  • 2,108
  • 22
  • 29
edwinnurek
  • 135
  • 2
  • 12

1 Answers1

1

Dagger only creates dependencies if they are needed. Since provideServersDao takes no arguments, Dagger concludes that ServersDao can be provided without any dependencies, and there is no reason to call provideRoom.

Since ServersDao actually depends on an instance of SoldatDatabase, you should ask Dagger to provide one for you:

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

}
Nitrodon
  • 3,089
  • 1
  • 8
  • 15