Jetpack Compose - LazyColumn 子项不会在重新组合时重新绘制

Jetpack Compose - LazyColumn children not redrawn on recompose

我的 LazyColumn 有一个非常奇怪的问题。我正在更新 ViewModel 中的 menuList 状态,视图重组但列表没有重绘。

当我使用调试器时,它到达 LazyColumn 然后停止,这意味着子项不会使用新数据重新绘制。任何想法为什么?谢谢!

我的观点:

val menuList = viewModel.menuData.observeAsState()

LazyColumn() { // <- Debugger stops here
                items(menuList.value.sections.size) { i->
                    MenuItem(menuList.value[i])
                }
}

我的视图模型:

private var menu: MenuUiState? = null
 val menuData: MutableLiveData<MenuUiState> by lazy {
    MutableLiveData<MenuUiState>()
}

// ...
menu?.sections?.forEach {
    //update menu properties here
}
menuData.value = menu?.copy()

您正在观察 MenuUiState 对象,但实际上并未观察对 sections 列表的项目所做的更改。

您应该在 MenuUiState 中将 sections 设为 MutableStateList,或者让 ViewModel 直接存储它:

val sections = mutableStateListOf<Section>() // store it either inside the ViewModel or inside MenuUiState

然后在可组合项中正常观察它:

LazyColumn() { // <- Debugger stops here
      items(viewModel.sections) { section ->
          MenuItem(section)
      }
}