为什么 Android Architecture Components 的 Observer 中的值参数可以为空?

Why is the value param nullable in Observer from Android Architecture Components?

来自体系结构组件的 LiveData 为接收者回调定义了一个可以为 null 的值的观察者:

public interface Observer<T> {
    /**
     * Called when the data is changed.
     * @param t  The new data
     */
    void onChanged(@Nullable T t);
}

为什么有显式可为 null 的注释?

LiveData.observe() 的文档还说:

If LiveData already has data set, it will be delivered to the observer.

例如观察者等待不可为空的更新或立即接收以前的不可为空的值,尤其是在 Kotlin 中,这应该保持不变,直到我将 T 定义为可空。

代码似乎是这样工作的。我理解为什么这不适用于 LiveData.getValue(),它可以在交付第一个数据之前手动调用(因此检查 mData != NOT_SET 到 return 是否为 null)。

所以第二个问题是:当 T 不可为空时,在 Kotlin 中假设该值为非空是否安全?

  1. 我认为他们将其设为 Nullable 的事实是他们想为那些想要通过使 liveData 的值无效来 reset 的人添加功能。还有人可能想要一个可为 null 的 LiveData(并在观察中使用该 null)。

  2. 如果您是 creating/producing LiveData,您可以假设它为 null(并使用 !! 运算符),因为 null 表示意外错误。您还可以创建一个 class 之类的 NonNullLiveData,它会忽略 setValue 中的空值。这样你就可以确定你永远不会在你的观察中收到空值(尽管你不能让 @Nullable 远离观察者)。

2.0.0-beta01 和更高的 androidx.lifecycle 版本开始,onChanged 参数不再包含 @Nullable 注释。更改是由于 improvement request OP 的礼貌。

package androidx.lifecycle;

/**
 * A simple callback that can receive from {@link LiveData}.
 *
 * @param <T> The type of the parameter
 *
 * @see LiveData LiveData - for a usage description.
 */
public interface Observer<T> {
    /**
     * Called when the data is changed.
     * @param t  The new data
     */
    void onChanged(T t);
}

当 T 不可为 null 时,在 Kotlin 中假设该值为非 null 是否安全?

这取决于,如果您是创建 LiveData 子类的人,或者只是简单地使用现有的 MutableLiveData 并且您设计它永远不会 return null 那么它是可以安全地假设它永远不会 return null。

如果 LiveData 不是由您隐式创建的,尤其是那些由库提供的 LiveData,我不会假设它是非空的,除非库文档提到它。

固定在 androix.lifecycle 2.0.0-beta01

如果您遇到任何问题,请报告 android Team