【问题标题】:LiveData is passing null to observerLiveData 将 null 传递给观察者
【发布时间】:2023-03-26 08:45:01
【问题描述】:

我有以下代码

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。

【问题讨论】:

    标签: kotlin android-room android-livedata


    【解决方案1】:

    LiveData 绝对允许将 null 发送给观察者,如果它是专门发布的。您可以看到android.arch.lifecycle.Observer.onChanged 的方法签名将数据参数显式标记为@Nullable

    如果您不想处理空类型,您可以简单地使用? 运算符来安全地处理它:

    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))
    

    【讨论】:

    • 但我认为 room 永远不会向 LiveData 观察者返回 null 对象?这是一个非常典型的用例,我有一个 Room dao 返回一个 LiveData 进行查询。这实际上是查询:@Query("SELECT * FROM cats LIMIT 1")
    • 我不能专门与 Room 库交谈,但也许 LIMIT 1 会导致它返回“Cat”而不是猫列表?不确定您的用例中隐含的 it 类型是什么。如果是这种情况,那么我认为如果它没有返回结果,那么获得一个 null 初始值可能是正常的。查看概述here,我没有看到任何迹象表明可以保证非空值——而是所有观察者都将参数类型声明为可为空。
    • 是的,看起来Room第一次返回,如果什么都没有,那就是null。
    猜你喜欢
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    相关资源
    最近更新 更多