当键盘出现时,我正试图自动将LazyColumn滚动到最后一个项目.然而,下面的代码是在其他StackOverflow讨论中建议的,其工作方式不一致,如所附图片所示,并且很少将最后一个项目带到视图中.

@OptIn(ExperimentalLayoutApi::class)
@Preview(showBackground = true)
@Composable
fun ChatScreen() {

    val viewModel: ChatScreenViewModel = viewModel()
    val textFieldContent = viewModel.textFieldState
    val messages =  viewModel.messageListState
    val listState = viewModel.messageListScrollState
    val keyboardVisibility = WindowInsets.isImeVisible

    LaunchedEffect(key1 = keyboardVisibility) {

        listState.animateScrollToItem(listState.layoutInfo.totalItemsCount)
    }

    ChatbotAppTheme {

        Column(
            modifier = Modifier
                .fillMaxSize()
                .systemBarsPadding()
                .imePadding()
        ) {
            // LazyColumn to hold messages
            LazyColumn(
                modifier = Modifier
                    .weight(1f),
                state = listState

            ) {
                items(messages) {
                    MessageBubble(
                        text = it.body,
                        role = it.role
                    )
                }
            }

            Row(
                modifier = Modifier
                    .fillMaxWidth()
                    .background(Color.Transparent),
                verticalAlignment = Alignment.CenterVertically,
                horizontalArrangement = Arrangement.SpaceAround
            ) {
                CustomTextField(
                    modifier = Modifier.weight(1f),
                    text = textFieldContent.value,
                    onValueChangeFunc = {viewModel.onTextFieldContentChanged(it)},
                    trailingIconFunc = {viewModel.clearTextField()},
                )
                CustomButton (enabled = textFieldContent.value.isNotEmpty()) {
                    viewModel.onSendButtonPressed()

                }
            }
        }
    }
}

我已经在 list 中设置了所需的android:windowSoftInputMode="adjustResize",并在MainActivity中设置了enableEdgeToEdge(),以确保isImeVisible正常工作.但是,我无法得到预期的结果.我真的很感激任何帮助或洞察力.

enter image description here

推荐答案

我在执行滚动之前添加了相当长的延迟来解决这个问题.注意,短延迟(例如,50ms)并不能解决问题.

@Composable
fun ChatScreen() {

//...
        val keyboardVisibility = WindowInsets.isImeVisible

        LaunchedEffect(key1 = keyboardVisibility) {
    
            if (keyboardVisibility == true){
                delay(300)
                viewModel.scrollToLastItem()
            }
        }
//...

}


class ChatScreenViewModel(): ViewModel() {

//...
    val messageListScrollState = LazyListState()

    fun scrollToLastItem(){
        viewModelScope.launch {
            messageListScrollState.scrollToItem(index = messageListScrollState.layoutInfo.totalItemsCount)
        }
    }
//...

}

Android相关问答推荐

为什么R8不混淆某些类?

将Android Studio插件复制到离线网络

Android和Rust,OpenSSL交叉编译在ARM V7上链接失败

在命令行Android应用程序开发中苦苦挣扎

如何使用Jetpack Compose实现此底表?

当 EditText 用于在 android studio 中将字符串发送到 firebase 时,仅允许安全调用错误

Android AGP 8 + Gradle 8 + Kotlin 1.8 导致 Kapt 出错

单击按钮时不显示 Toast 消息

从 HiltViewModel @Injection 访问 Application()

为什么我要使用 $version 而不是2.7.0?

未解决的参考:pagerTabIndicatorOffset

每次在 Jetpack Compose 中调用导航

MediumTopAppBar Material3 只更改大标题

房间创建三四表关系

如何授予对 Uri 图像的永久权限(androidx)

Android Studio:如何添加应用程序质量洞察窗口以查看 Android Studio 中的 Crashlytics 数据?

Firebase Crashlytics 缩小 R8 Android

我可以在不解密的情况下使用 JSch 获取加密的 SSH 私钥的类型或 fingerprint 吗?

Jetpack Compose Tapjacking:过滤对模糊 UI 的touch

将生成的 AAR 与 Composables 一起使用时未解决的参考