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

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)

Wil*_*ran 4

我猜你的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)