如何解决LiveData“按引用传递”初始值
我有一个ViewModel
类,看起来像这样:
class EditUserViewModel(
private val initUser: User,) : ViewModel() {
private val _user = MutableLiveData(initUser)
val user: LiveData<User>
get() = _user
fun hasUserChanged() = initUser != _user.value
}
User
可以通过UI更新User数据类实例的某些属性。
要检查从片段导航时是否有任何更改,我使用了hasUserChanged
方法。
问题是,这总是错误的。我检查了一下,似乎每次更改_user initialUser
时,MutableLiveData
都会更改。
这是为什么? MutableLiveData
的初始值是否通过引用传递?我一直以为Kotlin是一种“按价值传递”的语言。
更新:
在将initUser
放入MutableLiveData
之前复制private val _user = MutableLiveData(initUser.copy())
时,问题似乎消失了。
@AttributeOverrides
但是我仍然没有理由为什么要这样做。
解决方法
Kotlin类似于Java,它们是按值传递的。如果您在equals
类中实现User
函数,或者将其设置为data class
(隐式实现equals
函数),则可以确保用户的内容对象由!=
运算符检查。
更新
例如,直接更改LiveData
的值,例如:
_user.value.name = "some name"
这意味着您正在更改name
的{{1}}属性,因为initUser
完全引用_user.value
所做的对象。因此,initUser
运算符始终返回false,因为我们有一个对象有两个引用。
现在,当您这样做时:
!=
您正在创建private val _user = MutableLiveData(initUser.copy())
的深层副本(我们将其称为initUser
),它是内存中具有X
相同属性值的新对象。
因此,实际上,通过更改initUser
之类的属性,您是在_user.value.name = "some name"
而非X
上进行了此更改。这导致保留initUser
中的初始值,这意味着不要更改它们并解决问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。