【问题标题】:LiveData Observer UninitializedPropertyAccessException: lateinit property siteDto has not been initializedLiveData Observer UninitializedPropertyAccessException:lateinit 属性 siteDto 尚未初始化
【发布时间】:2020-03-19 00:14:40
【问题描述】:

我的应用程序具有以下顺序。 在数据库层我有返回 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)
          }
   })

}

如您所见,查询需要一些参数(serverId、siteId),这些参数是我从 Intent 中获取的。因此,在我声明 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 尚未初始化

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2019-12-02
      • 2018-11-07
      • 1970-01-01
      • 2021-06-21
      • 2017-03-03
      • 2012-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多