Android ViewModels。数据类是否应该暴露livedata属性?

问题描述 投票:0回答:1

考虑到这种情况。

模型

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

查看型号

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

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

界面

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

当用户点击 "Change!"按钮时,文本视图不会改变,因为 "name "字段不是LiveData。

疑问

  • 数据类是否也应该将其字段重新暴露为LiveData?
  • 如果是这样,常规字段会发生什么?它们是被替换掉还是用其他的命名规范来保留?
  • 如果我使用的是 retrofit,正确的命名方式是什么?这样我就可以用较少的代码量让接口方法和LiveData同时工作?
android retrofit android-livedata android-architecture-components android-viewmodel
1个回答
1
投票

你的问题是你修改了 User 对象属性,而不是直接更新LiveData。

要做到这一点,你必须做以下工作之一。

  • Make User 延伸 BaseObservable,并调用 notifyPropertyChanged(BR.name)name 属性变化,并删除 LiveData<User>.

  • 使 User 延伸 BaseObservable,并把 @Bindable 注解,并删除属性获取器上的 LiveData<User>.

  • 使 User 属性 val,并且要进行修改,请创建一个新的 User 实例,并将其设置为具有更改属性的 MutableLiveData<User>.

  • 沟渠 SelectedUser 全部,代之以两个 ObservableField的,一个为 selectedId: ObservableInt,和一个用于 selectedName: ObservableField<String>. 现在你可以修改原地的值,也可以从databinding创建针对它的绑定。

  • 移除数据绑定并使用viewbinding来代替,现在你不必担心通知数据绑定框架的属性变化。😏

数据类是否也应该将其字段重新暴露为LiveData?

不应该

© www.soinside.com 2019 - 2024. All rights reserved.