Когда использовать Android LiveData и поле Observable? - PullRequest
0 голосов
/ 19 сентября 2018

Я реализую MVVM и привязку данных, и я пытаюсь понять, когда мне следует использовать поле Observable поверх LiveData?

Я уже пробежался по разным документам и обнаружил, что LiveData поддерживает жизненный цикл, нов примерах кодов в Github эти два используются одновременно во ViewModel.Итак, я запутался, если LiveData лучше, чем поле Observable, почему бы просто не использовать LiveData вообще?

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Оба варианта имеют свои варианты использования, например:

  • Если вы хотите использовать допустимый контейнер жизненного цикла для вашей модели состояния пользовательского интерфейса, LiveData - это ответ.

  • Если вы хотите, чтобы пользовательский интерфейс обновлялся при изменении части логики в вашей модели представления, тогда используйте ObservableFields.

Я сампредпочитая использовать комбинацию LivaData и ObservableField/BaseObservable, LiveData обычно будет вести себя как контейнер данных с учетом жизненного цикла, а также как канал между виртуальной машиной и представлением.

С другой стороны,Объекты модели состояния пользовательского интерфейса, которые выводятся через LiveData, сами BaseObservable или имеют свои поля как ObservableField.

Таким образом, я могу использовать LiveData для общего изменения состояния пользовательского интерфейса.И устанавливайте значения в полях модели состояния пользовательского интерфейса ObservableField всякий раз, когда требуется обновить небольшую часть пользовательского интерфейса.

Редактировать : Вот краткая иллюстрация, например, для компонента UserProfile:

UIStateModel

data class ProfileUIModel(
    private val _name: String,
    private val _age: Int
): BaseObservable() {
    var name: String
        @Bindable get() = _name
        set(value) {
          _name = value
          notifyPropertyChanged(BR.name)
        }
    var age: Int
        @Bindable get() = _age
        set(value) {
          _age = value
          notifyPropertyChanged(BR.age)
        }
}

ViewModel

class UserProfileViewModel: ViewModel() {

    val profileLiveData: MutableLiveData = MutableLiveData()

    ...

    // When you need to rebind the whole profile UI object.
    profileLiveData.setValue(profileUIModel)

    ...

    // When you need to update a specific part of the UI.
    // This will trigger the notifyPropertyChanged method on the bindable field "age" and hence notify the UI elements that are observing it to update.
    profileLiveData.getValue().age = 20 
}

Просмотр

Вы будете наблюдать изменения профиля LiveData в обычном режиме.

XML

Вы будете использовать привязку данных для привязки модели состояния пользовательского интерфейса.

Редактировать : Теперь зрелый Я предпочитает Неизменность вместо того, чтобы иметь изменяемые свойства, как объяснено в ответе.

0 голосов
/ 19 сентября 2018

Вы можете использовать LiveData все время, пока есть LifecycleOwner для наблюдения.Я предпочитаю сохранять связанные поля, которые относятся только к ViewModel, как Observable и использовать LiveData для полей, изменения состояния которых также относятся к Activity или Fragment.

.
...