Jetpack Compose - LazyColumn 用于在添加项目时不重新组合 [英] Jetpack Compose - LazyColumnFor not recomposing when item added
问题描述
我正在尝试在 Jetpack Compose 中创建一个项目列表,该列表会在基础数据发生更改时自动更新,但它不会更新,并且我无法在初始组合后将项目添加到 LazyColumnFor.
I am trying to create a list of items in Jetpack Compose that automatically updates whenever the underlying data changes, but it is not updating and I cannot add an item to the LazyColumnFor after it has initially composed.
private var latestMessages = mutableListOf<ChatMessage>()
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
return ComposeView(context = requireContext()).apply {
setContent {
LatestMessages(latestMessages)
}
}
}
@Composable
fun LatestMessages(messages: MutableList<ChatMessage>) {
Column {
LazyColumnFor(items = messages) { chatMessage ->
LatestMessageItem(chatMessage) {
// onclick
}
}
}
Box(alignment = Alignment.Center) {
Button(onClick = {
latestMessages.add(
ChatMessage(
"testId",
"testText2",
"testFromId2",
"testToId",
"timestamp",
0
)
)
}) {
}
}
}
Box 中的 Button 只是为了测试添加一个项目.据我了解 LazyColumnFor 应该在底层数据发生更改时更新,类似于 SwiftUI 中的 ForEach.我做错了什么?
The Button in the Box is just to test adding an item. From what I understand LazyColumnFor should update whenever the underlying data is changed, similar to ForEach in SwiftUI. What am I doing wrong?
推荐答案
Jetpack compose 总是需要在重新组合发生之前修改一个状态对象.您需要使用 MutableStateList
.您可以传递对它的引用并在任何接受 SnapShotStateList
Jetpack compose always needs a state object to be modified before recomposition can occur. You need to use a MutableStateList<T>
. You can pass a reference to it around and update in any method which accepts a SnapShotStateList<T>
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
return ComposeView(context = requireContext()).apply {
setContent {
val latestMessages = mutableStateListOf<ChatMessage>()
LatestMessages(latestMessages)
}
}
}
@Composable
fun LatestMessages(messages: SnapshotStateList<ChatMessage>) {
Column {
LazyColumnFor(items = messages) { chatMessage ->
LatestMessageItem(chatMessage) {
// onclick
}
}
}
Box(alignment = Alignment.Center) {
Button(onClick = {
latestMessages.add(
ChatMessage(
"testId",
"testText2",
"testFromId2",
"testToId",
"timestamp",
0
)
)
}) {
}
}
}
这篇关于Jetpack Compose - LazyColumn 用于在添加项目时不重新组合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!