【问题标题】:How to observe LiveData changes from a Room Database using Data Binding Library如何使用数据绑定库观察房间数据库中的 LiveData 变化
【发布时间】:2018-04-14 08:25:12
【问题描述】:

第一次实现房间和数据绑定。

在我的ViewModel

var numberOfClubs = ObservableInt(0)
private var clubs: LiveData<List<Club>> = clubDao.getAllClubs()

然后我尝试在插入 Room 数据库后获取 clubs.value,但每次都得到 KotlinNullPointerException

fun addClubs() {
    Observable.fromCallable({
        clubDao.insertClubs(listOf(Club(null, "clubName"))
    })
        .subscribeOn(schedulerFacade.computation)
        .subscribe(
            {
                numberOfClubs.set(clubs.value!!.size) <--- Kotlin NPE
            },
            { error ->
                logWrapper.e("MainViewModel", error.message!!)
                clubError.set(true)
            })
}

在我的 XML 中,我调用的是:android:text="@{viewModel.numberOfClubs}"

由于插入 Room 数据库不会导致返回任何内容,因此我无法将结果设置为 numberOfClubs。我认为clubs 应该跟踪更改?

【问题讨论】:

    标签: android mvvm data-binding


    【解决方案1】:

    我对@9​​87654324@ 有点误解。为了让LiveData 对象开始发射东西是.observe() 它。由于LiveData 具有生命周期意识,因此最好从FragmentActivity 中调用.observe(),因为它引用了LifecycleOwner,它必须是传递给.observe() 的第一个参数。

    我可能没有遵循最佳实践,因为我在 ViewModel 中从我的 Activity 设置了一个 ObservableInt,但我使用了:

    viewModel.clubs
        .observe(this, Observer { clubs ->
            viewModel.numberOfClubs.set(clubs!!.size)
        })
    

    【讨论】:

      【解决方案2】:

      是的,正如您已经发现 LiveData 是生命周期感知的。这意味着只要生命周期所有者在场,它就会观察。

      即使您已经发布了解决方案,也不应该使用 !!一点也不。

      viewModel.clubs.observe(this, {
          it?.let { 
             viewModel.numberOfClubs.set(it.size)
          }
      )
      

      在分配接收列表的大小之前进行空检查是正确的方法。

      顺便说一句,如果你想在你的布局中获取项目的大小,你应该使用

      text="@{viewModel.clubsList.size() + ``}" 
      

      并观察一个列表,而不是使用列表大小

      val clubsList = ObservableArrayList<..>() 
      
      viewModel.clubs.observe(this, {
          it?.let { 
             viewModel.clubsList.set(it)
          }
      )
      

      【讨论】:

      • 非常感谢添加的 cmets :)
      猜你喜欢
      • 2019-03-18
      • 1970-01-01
      • 2020-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多