android - Jetpack Compose - LazyColumnFor 在添加项目时不重新组合

标签 android kotlin android-jetpack-compose

我正在尝试在 Jetpack Compose 中创建一个项目列表,该列表会在基础数据更改时自动更新,但它不会更新,并且我无法在 LazyColumnFor 最初组成后将项目添加到它。

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中的按钮只是为了测试添加一个项目。据我了解,LazyColumnFor 应该在基础数据发生更改时更新,类似于 SwiftUI 中的 ForEach。我究竟做错了什么?

最佳答案

编辑 2022 年 3 月
Jetpack compose 不再使用 LazyColumnFor所以我更新了答案以反射(reflect)撰写的当前状态。
Jetpack compose 始终需要在进行重组之前修改状态对象。您需要使用 MutableStateList<T> .您可以传递对它的引用并以任何接受 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 {
        LazyColumn { 
            items(messages){ chatMessage ->
                LatestMessageItem(chatMessage) {
                // onclick
                }
         }
      }
    Box(alignment = Alignment.Center) {
        Button(onClick = {
            latestMessages.add(
                ChatMessage(
                    "testId",
                    "testText2",
                    "testFromId2",
                    "testToId",
                    "timestamp",
                    0
                )
            )
        }) {

        }
    }
}

关于android - Jetpack Compose - LazyColumnFor 在添加项目时不重新组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65039054/

相关文章:

kotlin - 我正在尝试使用 Jetpack Compose 在 Android 中设置背景图片,但图片无法填满整个页面

android - Android 上的 VideoCast 示例应用程序未检测到转换设备

Android——几乎完全在 OpenGL 中制作用户界面有什么问题吗?

java - 将响应处理程序与 VertX 中的请求进行匹配

android - 列表不能转换为我的扩展列表的类。为什么?

android - Jetpack Compose LazyRow 滚动仅捕捉到下一个或上一个元素的开始

android - Flutter in_app_purchase 停留在 queryProductDetails() 方法

android - 从详细 View 返回时,Flutter TabBar 会重置索引

来自java的kotlin函数默认参数

android - Jetpack 撰写 : Modify Room data class using TextField