Dav*_*d A 5 android-jetpack-compose
我正在尝试创建一个可以动态更新的列表,它可能会更改几个或多个字段。的初始更新updateItems()
很好,一切都按其应有的方式显示,但是 updateOneItem 的连续更新会被 Jetpack Compose 忽略。
// ****ViewModel code
val _itemList: MutableStateFlow<List<Item>> = MutableStateFlow(emptyList())
fun updateItems() {
viewModelScope.launch {
_itemList.value = itemRepository.getItems()
}
}
fun updateOneItem(newVal:Int){
_itemList.value[_itemList.value.indexOf(item)].weight = newVal
//this is where I cannot have an update show up in compose no matter what
_itemList.tryEmit(_itemList.value)
}
// ****continued ViewModel Code
Run Code Online (Sandbox Code Playgroud)
我一直在尝试复制列表,也尝试过mutableStateListOf
,但到目前为止没有任何效果。
Phi*_*hov 16
Flow 无法知道包含对象的某些可变属性何时发生变化。当您尝试发出它时,它会检查对象的地址 - 它与原来的地址相同 - 并忽略该发出。
您可以通过创建列表的副本来强制执行此操作。
但最干净的方法是使用mutableStateListOf
并使您的项目成为不可变的数据类,然后您可以通过创建副本轻松更新它。查看为什么不变性在函数式编程中很重要?
它可以看起来像这样:
data class Item(val weight: Int)
private val _itemList = mutableStateListOf<Item>()
val itemList: List<Item> = _itemList
fun updateItems() {
viewModelScope.launch {
_itemList.addAll(itemRepository.getItems())
}
}
fun updateOneItem(newVal:Int){
val index = _itemList.indexOf(item)
_itemList[index] = _itemList[index].copy(weight = newVal)
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
8645 次 |
最近记录: |