尽管 LiveData 发生变化,但 Composable 不会重构
Composable doesn't recompose although LiveData changes
我只想在用户单击按钮时将节点添加到列表并将其显示在可组合的 LazyColumn 中。
这是我认为它的工作方式:
VieModel:
private val _nodeList: MutableLiveData<MutableList<Node>> = MutableLiveData()
val nodeList: LiveData<MutableList<Node>> = _nodeList
fun onNodeListChange(newNode: Node){
_nodeList.value?.add(newNode)
}
在我的可组合项中,我尝试通过调用来观察它:
val vm = getViewModel<MainViewModel>()
val nodeList: List<Node> by vm.nodeList.observeAsState(listOf())
在我调用的按钮的 onClick 中:
val newNode = Node(title, body)
vm.onNodeListChange(newNode)
节点已添加到 ViewModel 中的节点列表,但可组合项不会重组。
我做错了什么?
您的 LiveData 没有改变。您只是将一个新项目添加到存储在 LiveData 中的列表中。对于 LiveData 通知它的观察者,livedata.getValue()
返回的对象必须占用与通过 livedata.setValue()
提供的内存不同的内存 space 一个快速而肮脏的解决方案是:
_nodeList.value = _nodeList?.value?.toMutableList()?.apply{add(newNode)}
在 Jetpack Compose 中,您可能希望使用 SnapShotStateList
作为可观察列表而不是 LiveData<List<T>>
我只想在用户单击按钮时将节点添加到列表并将其显示在可组合的 LazyColumn 中。
这是我认为它的工作方式: VieModel:
private val _nodeList: MutableLiveData<MutableList<Node>> = MutableLiveData()
val nodeList: LiveData<MutableList<Node>> = _nodeList
fun onNodeListChange(newNode: Node){
_nodeList.value?.add(newNode)
}
在我的可组合项中,我尝试通过调用来观察它:
val vm = getViewModel<MainViewModel>()
val nodeList: List<Node> by vm.nodeList.observeAsState(listOf())
在我调用的按钮的 onClick 中:
val newNode = Node(title, body)
vm.onNodeListChange(newNode)
节点已添加到 ViewModel 中的节点列表,但可组合项不会重组。 我做错了什么?
您的 LiveData 没有改变。您只是将一个新项目添加到存储在 LiveData 中的列表中。对于 LiveData 通知它的观察者,livedata.getValue()
返回的对象必须占用与通过 livedata.setValue()
提供的内存不同的内存 space 一个快速而肮脏的解决方案是:
_nodeList.value = _nodeList?.value?.toMutableList()?.apply{add(newNode)}
在 Jetpack Compose 中,您可能希望使用 SnapShotStateList
作为可观察列表而不是 LiveData<List<T>>