首页 > 解决方案 > LiveData 将 null 传递给观察者

问题描述

我有以下代码

myViewModel.catLiveData.observe(this,Observer{
  if(it==null){
      Log.d(TAG,"the object returned is null! How is that possible?")
  }else{ doWork(it) }
})

我怎么可能得到空值?我认为 LiveData 不应该将 null 传递给观察者?顺便说一下,这个 LiveData 正在监听 Room Entity。

标签: kotlinandroid-roomandroid-livedata

解决方案


LiveDatanull如果专门发布,绝对允许将其发送给观察者。您可以看到方法签名android.arch.lifecycle.Observer.onChanged明确地将数据参数标记为@Nullable.

如果你不想处理 null 类型,你可以简单地使用?操作符来安全地处理它:

myViewModel.catLiveData.observe(this, Observer { it?.let(::doWork) })

或者,您可以创建自己的自定义Observer来为您处理它,例如

class Observer2<T>(private val block: (T) -> Unit) : Observer<T> {
    override fun onChanged(data: T?) {
        data?.let(block)
    }
}

这将允许您编写:

myViewModel.catLiveData.observe(this, Observer2(::doWork))

推荐阅读