Почему значение параметра может обнуляться в Observer из компонентов архитектуры Android? - PullRequest
0 голосов
/ 11 мая 2018

LiveData из компонентов архитектуры определяет Observer со значением NULL для обратного вызова получателя:

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

Почему существует явно обнуляемая аннотация?

Документ изLiveData.observe() также говорит:

Если LiveData уже имеет набор данных, он будет доставлен наблюдателю.

Например, Observer ожидает необнуляемые обновления или немедленно получаетпредыдущее необнуляемое значение, которое должно сохраняться, особенно в Kotlin, до тех пор, пока я не определю T как обнуляемое.

Кажется, код работает так.Я понимаю, почему это не относится к LiveData.getValue(), который может быть вызван вручную до доставки первых данных (и поэтому проверяет, чтобы mData != NOT_SET возвращал ноль).

Итак, второй вопрос: Можно ли предположить, что значение не является нулевым в Kotlin, когда T не имеет значения NULL?

Ответы [ 3 ]

0 голосов
/ 19 мая 2018

Начиная с 2.0.0-beta01 и более поздних версий androidx.lifecycle, параметр onChanged больше не содержит аннотацию @Nullable.Изменения вызваны запросом на улучшение , любезно предоставленным 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);
}

Можно с уверенностью предположить, что значение не является нулевым в Kotlin, когда T не имеет значения NULL.?

Зависит от того, что вы тот, кто создал подкласс LiveData, или просто используете существующий MutableLiveData, и вы разрабатываете его так, чтобы он никогда не возвращал ноль, тогда можно с уверенностью предположитьчто он никогда не вернет ноль.

Для случая, когда LiveData неявно создан не вами, особенно теми, кто LiveData предоставлен библиотеками, я бы не предположил, что он ненулевой, если в документации библиотеки его не упоминается.

0 голосов
/ 29 мая 2018

Исправлено в androix.lifecycle 2.0.0-beta01.

Пожалуйста, сообщайте Команда Android , если у вас возникнут какие-либо проблемы.

0 голосов
/ 19 мая 2018
  1. Я думаю, тот факт, что они сделали это Nullable, заключается в том, что они хотели добавить функциональность для тех, кто хочет reset liveData, обнуляя их значение. Также кто-то может захотеть обнуляемые LiveData (и использовать этот ноль для наблюдения).

  2. Если вы создаете / производите LiveData, вы можете предположить, что оно пустое (и использовать оператор !!), поскольку пустое значение указывает на непредвиденную ошибку. Также вы можете создать класс, такой как NonNullLiveData, который игнорирует значения, которые являются нулевыми в его setValue. Таким образом, вы можете быть уверены, что вы никогда не получите нулевые значения в своем наблюдении (хотя вы не можете заставить @Nullable отойти от наблюдателя).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...