繁体   English   中英

Android ViewModels:数据类是否应该公开 livedata 属性?

[英]Android ViewModels: Should dataclasses expose livedata properties?

鉴于这种情况:

Model

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

查看 Model

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()}"/>

当用户单击“更改”时。 按钮 textview 不会更改,因为“名称”字段不是 LiveData。

问题

  • 数据 class 是否也应该将其字段重新公开为 LiveData?
  • 如果是这样,常规字段会发生什么? 它们是否被替换或保留了另一个命名约定?
  • 如果我使用 retrofit,正确的命名约定是什么? 所以我可以让接口方法和 LiveData 都使用更少的代码?

您的问题是您正在直接修改User object 属性,而不是更新 LiveData。

为此,您必须执行以下操作之一:

  • 使User扩展BaseObservable ,并在name属性更改时调用notifyPropertyChanged(BR.name) ,并删除LiveData<User>

  • 使User扩展BaseObservable ,并将@Bindable注释放在属性 getter 上,并删除LiveData<User>

  • 使User属性为val ,并进行修改,使用更改的属性创建一个新的User实例,并将其设置为MutableLiveData<User>的值。

  • 完全抛弃SelectedUser ,并将其替换为两个ObservableField ,一个用于selectedId: ObservableInt ,一个用于selectedName: ObservableField<String> 现在您可以就地修改这些值,还可以通过数据绑定创建针对它的绑定。

  • 删除数据绑定并改用视图绑定,现在您不必担心通知数据绑定框架属性更改。

数据 class 是否也应该将其字段重新公开为 LiveData?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM