You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何adjustNothing在ModalBottomSheet中未生效?键盘弹出时按钮上移

ModalBottomSheet按钮随键盘上移问题解决

问题场景

点击ModalBottomSheet内的文本框弹出键盘时,底部按钮会随键盘上移。全局未配置windowSoftInputMode,处于adjustNothing状态,但普通Column组件无此异常。

用户代码示例:

ModalBottomSheet(
    onDismissRequest = {
        showDeleteUserSheet = false
    },
    sheetState = sheetState
) {
    Box(
        modifier = Modifier
            .fillMaxSize()
            .padding(16.dp)
        ) {
        Column(modifier = Modifier
            .fillMaxWidth()
            .align(Alignment.TopCenter),
            horizontalAlignment = Alignment.CenterHorizontally
        ) {
            Text(
                text = "Sample title",
                textAlign = TextAlign.Center,
                modifier = Modifier.wrapContentSize()
            )
            Spacer(modifier = Modifier.height(24.dp))
            Text(
                text = "text",
                color = MaterialTheme.colorScheme.white.copy(alpha = 0.6f),
                textAlign = TextAlign.Center,
                modifier = Modifier.wrapContentSize()
            )

            Spacer(modifier = Modifier.height(40.dp))

            TextField(
                hint = "Sample hint1"
            )
            Spacer(modifier = Modifier.height(10.dp))

            TextField(
                hint = "Sample hint2"
            )
        }

        Column(modifier = Modifier.align(Alignment.BottomCenter)) {
            Button() {

            }

            Spacer(modifier = Modifier.height(10.dp))

            Button() {
            }

            Spacer(modifier = Modifier.height(50.dp))
        }
    }
}

解决方法

方法1:替换固定间距为imePadding()

将底部Column的固定底部Spacer替换为imePadding()修饰符,让布局自动适配键盘高度,同时保持按钮位置相对底部不变:

Column(modifier = Modifier
    .align(Alignment.BottomCenter)
    .imePadding()) {
    Button() {

    }

    Spacer(modifier = Modifier.height(10.dp))

    Button() {
    }
}

方法2:取消ModalBottomSheet的IME响应

通过windowInsets参数强制关闭Sheet对输入法内边距的响应:

ModalBottomSheet(
    onDismissRequest = { showDeleteUserSheet = false },
    sheetState = sheetState,
    windowInsets = WindowInsets(0, 0, 0, 0)
) {
    // 原有内容
}

方法3:拦截嵌套滚动事件

添加NestedScrollConnection拦截键盘触发的滚动行为,阻止内容上移:

val nestedScrollConnection = remember {
    object : NestedScrollConnection {
        override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
            return if (source == NestedScrollSource.SoftwareKeyboard) available else Offset.Zero
        }
    }
}

ModalBottomSheet(...) {
    Box(
        modifier = Modifier
            .fillMaxSize()
            .padding(16.dp)
            .nestedScroll(nestedScrollConnection)
    ) {
        // 原有内容
    }
}

原因分析

ModalBottomSheet内部默认会监听输入法窗口的变化,即使全局设置adjustNothing,其内部布局逻辑仍会根据键盘高度调整内容位置。上述方法分别通过适配内边距、取消响应、拦截滚动三种方式,阻断了Sheet内容随键盘上移的行为。

内容的提问来源于stack exchange,提问作者SangSun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 16:53:36