为什么 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 中假设该值为非空是否安全?
我认为他们将其设为 Nullable 的事实是他们想为那些想要通过使 liveData 的值无效来 reset
的人添加功能。还有人可能想要一个可为 null 的 LiveData(并在观察中使用该 null)。
如果您是 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。
来自体系结构组件的 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 中假设该值为非空是否安全?
我认为他们将其设为 Nullable 的事实是他们想为那些想要通过使 liveData 的值无效来
reset
的人添加功能。还有人可能想要一个可为 null 的 LiveData(并在观察中使用该 null)。如果您是 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。