gpt4 book ai didi

android - 即使状态发生变化,我的可组合 View 也不会自行重组

转载 作者:行者123 更新时间:2023-12-04 11:26:11 25 4
gpt4 key购买 nike

我正在尝试使用 jetpack compose 开发示例聊天应用程序并与状态作斗争。我有包含消息的lazyColumn。我的问题是当用户单击按钮时,即使我的列表得到更新,我的“ChatList”功能也不会重新组合。它仅在“消息”状态更改时重新组合。因此,在向 texxtfield 键入内容后,我可以在列表中看到之前添加的消息。
这是我的组合和 View 模型:

@Composablefun ChatList() {
ConstraintLayout {
val (list, send) = createRefs()
val viewModel = viewModel<MainViewModel>()
val chatList by viewModel.messages.observeAsState(viewModel.messageList)
var message by rememberSaveable { mutableStateOf("") }
val state = rememberLazyListState()
LazyColumn(state = state, modifier = Modifier.constrainAs(list) {
top.linkTo(parent.top)
bottom.linkTo(send.top)
height = Dimension.fillToConstraints
}) {
items(chatList) { item ->
when (item.isMe) {
true -> ChatLayoutMe(item.message)
false -> ChatLayout(item.message)
}
}
}
SendMessage(message = message, modifier = Modifier.constrainAs(send) {
bottom.linkTo(parent.bottom)
}) {
message = it
}
}}

@Composablefun SendMessage(message: String, modifier: Modifier, onMessageChange: (String) -> Unit) {
......
Column(
modifier = Modifier
.clickable { viewModel.addMessage(message) }
......
}

class MainViewModel : ViewModel() {

val messages = MutableLiveData<List<ChatItem>>()

val messageList = mutableListOf<ChatItem>().apply {
............
}

fun addMessage(message: String) {
messageList.add(ChatItem(message, true))
messages.value = messageList
}
}

最佳答案

我猜你的 messageList属性正在获取相同内存地址的相同实例(这将无法 - 触发 - 通知新数据)。尝试更改 addMessage 中的代码作用于:

fun addMessage(message: String) {
messageList.add(ChatItem(message, true))
// messages.value = messageList
messages.value = messageList.toMutableList() // Copy it to a new memory address
}

关于android - 即使状态发生变化,我的可组合 View 也不会自行重组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66407816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com