Это похоже MutableLiveData
отличается от LiveData
только путем создания setValue()
и postValue()
общественность методов, тогда как в LiveData
они защищены.
Что является некоторыми причинами сделать отдельный класс для этого изменения и не просто определить те методы как общественность в LiveData
самостоятельно?
Вообще говоря, такая форма наследования (увеличивающий видимость определенных методов, являющихся единственным изменением) известная практика и каковы некоторые сценарии, где это может быть полезно (предположение, что у нас есть доступ ко всему коду)?
Это - целое 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
}