Почему существует отдельный подкласс MutableLiveData LiveData?

Это похоже MutableLiveData отличается от LiveData только путем создания setValue() и postValue() общественность методов, тогда как в LiveData они защищены.

Что является некоторыми причинами сделать отдельный класс для этого изменения и не просто определить те методы как общественность в LiveData самостоятельно?

Вообще говоря, такая форма наследования (увеличивающий видимость определенных методов, являющихся единственным изменением) известная практика и каковы некоторые сценарии, где это может быть полезно (предположение, что у нас есть доступ ко всему коду)?

58
задан 19 October 2017 в 13:01

1 ответ

Это - целое MutableLiveData.java файл:

package androidx.lifecycle;
/**
 * {@link LiveData} which publicly exposes {@link #setValue(T)} and {@link #postValue(T)} method.
 *
 * @param <T> The type of data hold by this instance
*/
@SuppressWarnings("WeakerAccess")
public class MutableLiveData<T> extends LiveData<T> {
    @Override
    public void postValue(T value) {
        super.postValue(value);
    }
    @Override
    public void setValue(T value) {
        super.setValue(value);
    }
}

Так да, различие прибывает только путем создания postValue и setValue общественность.

Один вариант использования, который я могу вспомнить прочь моей головы, для инкапсуляции с помощью [1 111] Отступающее Свойство в Kotlin. Можно выставить LiveData Фрагменту/Действию (Контроллер UI) даже при том, что Вы можете иметь MutableLiveData для управления в Вашем ViewModel класс.

    class TempViewModel : ViewModel() {
        ...
        private val _count = MutableLiveData<Int>()
        val count: LiveData<Int>
            get() = _count
        public fun incrementCount() = _score.value?.plus(1)
        ...
    }

Этот путь Ваш Контроллер UI только сможет наблюдать, что значения не имея возможности редактируют их. Очевидно, Ваш Контроллер UI может отредактировать значения с помощью открытых методов TempViewModel как [1 110].

Примечание : разъяснить изменяемый/неизменный беспорядок -

data class User(var name: String, var age: Int)

class DemoLiveData: LiveData<User>()

var demoLiveData: LiveData<User>? = DemoLiveData()

fun main() {
    demoLiveData?.value = User("Name", 23) // ERROR
    demoLiveData?.value?.name = "Name" // NO ERROR
    demoLiveData?.value?.age = 23  // NO ERROR
}
2
ответ дан 1 November 2019 в 14:28

Другие вопросы по тегам:

Похожие вопросы: