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)
}
}
我的 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)
}
}