LiveData观察者UninitializedPropertyAccessException:lateinit属性siteDto尚未初始化

时间:2020-03-19 00:14:40

标签: kotlin android-room android-livedata android-viewmodel

我的应用程序具有以下顺序。 在数据库层中,我有返回LiveData的查询

@Query("Select * from sites where server_id = :serverId and site_id = :siteId")
fun getSite(serverId: Long, siteId: Int): LiveData<SiteDto>

在我的存储库中,我有一个返回该查询的函数

override fun retrieveSite(serverId: Long, siteId: Int): LiveData<SiteDto> {
        return sitesDao.getSite(serverId, siteId)
    }

在“活动”中,我观察到SiteDto,以便可以显示有关它的一些信息 但是仅在某些情况下来自活动的意图。所以

if(condtion) {

   myViewModel.getSite().observe(this, Observer {
          it?.let {
             println(it.description)
          }
   })

}

如您所见,查询需要一些参数(我从Intent获取它们)(serverId,siteId)。因此,在声明myViewModel之后,我将setArguments(...)函数中的参数传递给viewModel。 (我可以使用ViewModelFactory,但是参数并不总是相同。.所以就算了吧)

所以问题是我在收到参数后应该如何从ViewModel内的存储库中获取网站

private lateinit var _siteDto: LiveData<SiteDto>
fun setArguments(....) {

 _siteDto = accountsRepository.retrieveSite(serverId, siteId)

}


fun getSite(): LiveData<SiteDto> {
        return _siteDto
    }

当我运行它时,出现以下错误
kotlin.UninitializedPropertyAccessException:lateinit属性siteDto尚未初始化

1 个答案:

答案 0 :(得分:0)

我认为您的问题是试图获取Livedata对象。 Livedata是一个包装器!您应该从数据库中返回一个SiteDTO?对象,而不是Livedata,因为您会收到一个实例化的Livedata,其中包含一个非实例化的SiteDTO(这是您当前的错误)...建议您检查一下Google为kotlin提供的实时数据代码实验室(https://codelabs.developers.google.com/android-kotlin-fundamentals/