如何让模态底部弹出框和键盘在同一个动画中同时显示?

移动开发 2026-07-10

我的 ModalBottomSheet 包含一个 TextField。当底部弹出层出现时,我也希望键盘一起弹出,这样就能直接在字段中输入文本。

不过现在,ModalBottomSheet 会先出现,然后键盘再弹出。键盘的动画结束后,ModalBottomSheet 会覆盖在上面,这看起来有点别扭。

val sheetState = rememberModalBottomSheetState()

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun TimestampEditorSheet(
    timestamp: Timestamp,
    onDismiss: () -> Unit,
    onSave: (Timestamp) -> Unit,
    sheetState: SheetState,
) {
    val scope = rememberCoroutineScope()
    val focusRequester = remember { FocusRequester() }


    LaunchedEffect(Unit) {
        focusRequester.requestFocus()
    }

    ModalBottomSheet(
        onDismissRequest = onDismiss,
        sheetState = sheetState,
        dragHandle = {},
    ) {
        TextField(
        state = textFieldState,
        placeholder = { Text("Description") },
        modifier = Modifier
            .weight(1f)
            .focusRequester(focusRequester),
    )
}

动画演示

我找到的唯一其他选项是在请求焦点之前等待模态动画完成。

sheetState.isAnimationRunning=true 只是在模态完全出现后半秒才设置,所以仍然没有达到我想要的那种顺滑感。

动态图

LaunchedEffect(sheetState.currentValue) {
    if(!sheetState.isAnimationRunning && sheetState.currentValue == SheetValue.Expanded) {
        focusRequester.requestFocus()
    }
}

当我旋转设备时,模态框和键盘会一起出现,因此这个动画是完全可以实现的。

动态图

编辑:

我尝试给模态工作表的内容添加底部填充,这样在初始动画时内容能出现在键盘之上,勉强实现了这个效果,但仍然不完美。

底部填充

解决方案

我使用了一个 [BottomSheetDialogFragment][2],正是我一直在寻找的。

已修复

我遇到了一个问题:键盘会遮挡Compose的 TextField,但当我使用XML的 EditText时它能正常工作,不过这是另一个问题。

XML视图:

XML 视图

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章