Ber*_*çci 6 android kotlin android-jetpack android-jetpack-compose
我正在尝试使用 jetpack compose 开发示例聊天应用程序并与状态作斗争。我有包含消息的lazyColumn。我的问题是,当用户单击按钮时,即使我的列表得到更新,我的“ChatList”功能也不会重新组合。仅当“消息”状态发生变化时才重新组合。因此,在我向文本字段输入内容后,我可以在列表中看到之前添加的消息。
这是我的可组合项和视图模型:
@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
}
}
Run Code Online (Sandbox Code Playgroud)
我猜你的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
}
Run Code Online (Sandbox Code Playgroud)