尽管 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>>