Почему бы не использовать mutableLiveData типа val вместо типа var?
Не является ли нарушением возможность установки типа val?
Как, например:
class LoadDetailViewModel : ViewModel() {
private val _liveData = MutableLiveData<String>()
val liveData: LiveData<String> get() = _liveData
fun loadData() = viewModelScope.launch {
_liveData.value = "value"
_liveData.postValue("value")
}
}
class LoadDetailViewModel : ViewModel() {
private var _liveData = MutableLiveData<String>()
var liveData: LiveData<String> get() = _liveData
fun loadData() = viewModelScope.launch {
_liveData.value = "value"
_liveData.postValue("value")
}
}
Но результат все равно эквивалентен. Нет ошибки, когда я объявляю mutableLiveData как var, но я не знаю, почему я должен объявлять его как val.
Android-разработчики Я искал официальные документы Android, но ответа на них не было.
Когда вы звоните _liveData.value = "value"
, обратите внимание, что вы не используете _liveData =
. Таким образом, вы не изменяете свойство _liveData
, и оно не обязательно должно быть var
. Вы изменяете свойство внутри MutableLiveData.
Неправильно использовать для этого var
, потому что вы не заменяете экземпляр MutableLiveData
. Если вы измените его на другой экземпляр, ваши наблюдатели не будут уведомлены.
Вы путаете изменчивость свойства (то, что содержит ссылку на экземпляр MutableLiveData) с классом (сам MutableLiveData). MutableLiveData — это изменяемый класс, поскольку внутри него есть изменяемые переменные. Вы можете изменить его, но не хотите изменять свойство, которое содержит ссылку на него.
Использование var
не вызывает никаких проблем, потому что вы на самом деле не использовали изменчивость для изменения ссылки на другой экземпляр. Но поскольку вы никогда не должны этого делать, нет причин использовать var
вместо val
. Это делает код более понятным и надежным в использовании val
.
Очень тесно связано: stackoverflow.com/q/51718229/5133585