Android ViewModels: должны ли классы данных предоставлять свойства живых данных? - PullRequest
0 голосов
/ 09 мая 2020

Для этого сценария:

Модель

data class User(var id: int, var name: String)

Просмотр модели

val Users: LiveData<List<User>>
val SelectedUser: LiveData<User>

fun changeSelectedUserName(){SelectedUser.Name = "foo"}

UI

<android:TextView Text="@{viewmodel.SelectedUser.name}"/>
<android:Button Text="Change!" onClik="@{() -> viewmodel.changeSelectedUserName()}"/>

Когда пользователь нажимает 'Изменить! ' текстовое представление не изменится, потому что поле 'name' не является LiveData.

Вопросы

  • Должен ли класс данных повторно отображать свои поля как LiveData?
  • Если да, что будет с обычными полями? Заменены ли они или сохранены другим соглашением об именах?
  • Какое правильное соглашение об именах, если я использую дооснащение? Таким образом, я могу сохранить и методы интерфейса, и LiveData, работая с меньшим количеством кода?

1 Ответ

1 голос
/ 02 июня 2020

Ваша проблема в том, что вы изменяете свойства объекта User напрямую, а не обновляете LiveData.

Чтобы это сработало, вы должны выполнить одно из следующих действий:

  • Сделать User расширить BaseObservable и вызвать notifyPropertyChanged(BR.name) при изменении свойства name и удалить LiveData<User>.

  • Сделать User расширить BaseObservable и поместить аннотацию @Bindable в геттеры свойств и удалить LiveData<User>.

  • Сделать User свойства val, а чтобы внести изменения, создайте новый экземпляр User с измененными свойствами и установите его как значение MutableLiveData<User>.

  • Ditch SelectedUser полностью и замените его двумя ObservableField s , один для selectedId: ObservableInt и один для selectedName: ObservableField<String>. Теперь вы можете изменять значения на месте, а также создавать привязки к ним из привязки данных.

  • Удалите привязку данных и вместо этого используйте привязку просмотра, теперь вам не нужно беспокоиться об уведомлении структуры привязки данных о изменения собственности. ?

Должен ли класс данных повторно отображать свои поля как LiveData?

Нет

...