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

如何在Compose ModalBottomSheet中启用垂直滚动且阻止其滚动关闭?

解决ModalBottomSheet滚动到底部自动关闭的问题

核心思路是让内部滚动组件优先处理拖拽事件,只有当内容无法继续向下滚动时,拦截触发Sheet关闭的拖拽动作,避免两者的事件冲突。

直接修改代码如下:

val sheetState = rememberModalBottomSheetState(
    skipPartiallyExpanded = true,
    confirmValueChange = {
        true
    }
)
// 抽离滚动状态,用于判断内容是否还能继续滚动
val scrollState = rememberScrollState()
// 定义嵌套滚动连接,协调父子组件的事件处理逻辑
val scrollConnection = remember {
    object : NestedScrollConnection {
        override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
            // 判断当前是否是向下拖拽、且内容已经滚到底部无法继续滚动
            val canScrollDown = scrollState.canScrollForward
            return if (source == NestedScrollSource.Drag && available.y > 0 && !canScrollDown) {
                available // 拦截事件,不让ModalBottomSheet捕获并触发关闭
            } else {
                Offset.Zero // 允许事件正常传递,不影响滚动和Sheet的其他操作
            }
        }
    }
}

ModalBottomSheet(
    sheetState = sheetState,
    content = {
        Box(
            modifier = Modifier
                .fillMaxSize()
                .nestedScroll(scrollConnection) // 关键:添加嵌套滚动修饰符
                .verticalScroll(scrollState)
                .padding(10.dp)
        ) {
            content()
        }
    }
)

代码说明

  • nestedScroll修饰符用来调整ModalBottomSheet(父组件)和内部滚动组件的事件传递优先级
  • 当检测到向下拖拽且内容已无法继续向下滚动时,拦截该拖拽事件,阻止ModalBottomSheet触发关闭逻辑
  • 其余场景(向上滚动、内容仍可向下滚动)都正常传递事件,既保留滚动体验,也不影响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.27 13:44:54