【发布时间】:2021-08-25 15:09:50
【问题描述】:
我有一个 Composable、一个 ViewModel 和一个 User 类的对象,其中包含一个 List 变量。在 ViewModel 中,我定义了一个 LiveData 对象来保存 User 对象,在 Composable 中,我想观察 User 对象中 List 的变化,但它似乎效果不佳。
我了解当您更改 List 的内容时,它的引用是相同的,因此 List 对象不会自行更改,但我尝试复制列表,但它不起作用;复制整个用户对象也不起作用;它似乎工作的唯一方法是如果我创建两者的副本。对于较大的列表和对象来说,这似乎太牵强而且成本太高。有没有更简单的方法来做到这一点?
我的代码是这样的:
可组合
@Composable
fun Greeting(viewModel: ViewModel) {
val user = viewModel.user.observeAsState()
Column {
// TextField and Button that calls viewModel.addPet(petName)
LazyColumn {
items(user.value!!.pets) { pet ->
Text(text = pet)
}
}
}
}
视图模型
class ViewModel {
val user: MutableLiveData<User> = MutableLiveData(User())
fun addPet(petName: String){
val sameList = user.value!!.pets
val newList = user.value!!.pets.toMutableList()
newList.add(petName)
sameList.add(petName) // This doesn't work
user.value = user.value!!.copy() // This doesn't work
user.value!!.pets = newList // This doesn't work
user.value = user.value!!.copy(pets = newList) // This works BUT...
}
}
用户
data class User(
// Other variables
val pets: MutableList<String> = mutableListOf()
)
【问题讨论】:
标签: android android-livedata android-jetpack-compose