使用Hilt时出现UninitializedPropertyAccessException

问题描述

我遇到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) 对象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()
}

}

解决方法

Dagger仅在需要时创建依赖项。由于provideServersDao不带任何参数,因此Dagger得出结论,可以提供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()
    }

}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...