如何在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
相关产品推荐
相关产品推荐

