Я создаю интерфейс чата в Jetpack Compose, используя LazyColumn.
Когда пользователь отправляет новое сообщение, я хочу, чтобы его последнее сообщение отображалось вверху, а более старые сообщения должны автоматически прокручиваться вверх.
Сейчас у меня есть это:
@Composable
fun ChatScreen() {
var message by remember { mutableStateOf("") }
val chatMessages = remember {
mutableStateListOf(
ChatbotMessage(content = "Hi there! How can I help you today?", isBot = true),
ChatbotMessage(content = "I need information about my account.", isBot = false),
ChatbotMessage(
content = "Sure, I can help with that. What specifically do you need to know?",
isBot = true,
),
ChatbotMessage(content = "What is my current balance?", isBot = false),
ChatbotMessage(content = "Your current balance is $1,234.56.", isBot = true),
ChatbotMessage(
content = "Thanks! Can you also show me my last 5 transactions?",
isBot = false,
),
ChatbotMessage(
content = "Of course. Here are your last 5 transactions...",
isBot = true,
),
ChatbotMessage(content = "Is there anything else?", isBot = true),
ChatbotMessage(content = "No, that's all for now. Thank you!", isBot = false),
ChatbotMessage(content = "You're welcome! Have a great day!", isBot = true),
)
}
val listState = rememberLazyListState()
Column(modifier = Modifier.fillMaxSize()) {
// Chat messages list
LazyColumn(
state = listState,
modifier = Modifier
.weight(1f)
.fillMaxWidth(),
contentPadding = PaddingValues(horizontal = 5.dp, vertical = 10.dp),
verticalArrangement = Arrangement.spacedBy(10.dp),
) {
items(chatMessages) { chatMessage ->
ChatBubble(
message = chatMessage,
modifier = Modifier.animateItem(),
)
}
}
// Input field and send button
Row(
modifier = Modifier
.fillMaxWidth()
.padding(8.dp),
verticalAlignment = Alignment.CenterVertically,
) {
OutlinedTextField(
value = message,
onValueChange = { message = it },
modifier = Modifier.weight(1f),
placeholder = { Text("Type a message...") },
singleLine = true,
)
IconButton(
onClick = {
if (message.isNotBlank()) {
chatMessages.add(ChatbotMessage(content = message, isBot = false))
message = ""
}
},
) {
Icon(
imageVector = Icons.AutoMirrored.Default.Send,
contentDescription = "Send",
tint = Color.Black,
)
}
}
}
}
Новые сообщения появляются внизу, а не вверху. Последнее сообщение не попадает наверх, потому что нет списка для прокрутки.
Новые сообщения, отправленные пользователями, появляются внизу, а не вверху. Я хочу, чтобы последнее сообщение было вверху, чтобы следующее сообщение чата было видно под ним; в противном случае пользователям придется прокручивать. Что у меня есть и Что я хочу:
Я создаю интерфейс чата в Jetpack Compose, используя LazyColumn. Когда пользователь отправляет новое сообщение, я хочу, чтобы его последнее сообщение отображалось вверху, а более старые сообщения должны автоматически прокручиваться вверх. Сейчас у меня есть это: [code]@Composable fun ChatScreen() { var message by remember { mutableStateOf("") } val chatMessages = remember { mutableStateListOf( ChatbotMessage(content = "Hi there! How can I help you today?", isBot = true), ChatbotMessage(content = "I need information about my account.", isBot = false), ChatbotMessage( content = "Sure, I can help with that. What specifically do you need to know?", isBot = true, ), ChatbotMessage(content = "What is my current balance?", isBot = false), ChatbotMessage(content = "Your current balance is $1,234.56.", isBot = true), ChatbotMessage( content = "Thanks! Can you also show me my last 5 transactions?", isBot = false, ), ChatbotMessage( content = "Of course. Here are your last 5 transactions...", isBot = true, ), ChatbotMessage(content = "Is there anything else?", isBot = true), ChatbotMessage(content = "No, that's all for now. Thank you!", isBot = false), ChatbotMessage(content = "You're welcome! Have a great day!", isBot = true), ) }
// Input field and send button Row( modifier = Modifier .fillMaxWidth() .padding(8.dp), verticalAlignment = Alignment.CenterVertically, ) { OutlinedTextField( value = message, onValueChange = { message = it }, modifier = Modifier.weight(1f), placeholder = { Text("Type a message...") }, singleLine = true, )
IconButton( onClick = { if (message.isNotBlank()) { chatMessages.add(ChatbotMessage(content = message, isBot = false)) message = "" } }, ) { Icon( imageVector = Icons.AutoMirrored.Default.Send, contentDescription = "Send", tint = Color.Black, ) } } } } [/code] Новые сообщения появляются внизу, а не вверху. Последнее сообщение не попадает наверх, потому что нет списка для прокрутки. Новые сообщения, отправленные пользователями, появляются внизу, а не вверху. Я хочу, чтобы последнее сообщение было вверху, чтобы следующее сообщение чата было видно под ним; в противном случае пользователям придется прокручивать. [b]Что у меня есть[/b] и [b]Что я хочу[/b]: [img]https://i.sstatic.net/O2OERd18m.jpg[/img]
[img]https://i.sstatic.net/4aIb7kCLm.jpg[/img]
[b]Я хочу что-то похожее на это:[/b] [img]https://i.sstatic.net/trA3iaUym.gif[/img]