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

Jetpack Compose中如何获取BottomSheet拖拽折叠/展开状态

获取BottomSheetScaffold中BottomSheet拖拽/折叠展开状态的实现方式

核心依赖组件自带的BottomSheetScaffoldState状态持有类实现,不需要自定义嵌套手势拦截,所有状态官方已经做了暴露。

  • 第一步:主动持有脚手架状态实例
    不要使用BottomSheetScaffold的默认scaffoldState,在Composable作用域内通过rememberBottomSheetScaffoldState()初始化实例,传入组件:
val scaffoldState = rememberBottomSheetScaffoldState()

BottomSheetScaffold(
    scaffoldState = scaffoldState,
    sheetPeekHeight = 80.dp, // 折叠状态下露出的高度
    sheetContent = { /* 底部表单内容 */ },
    content = { /* 页面主体内容 */ }
)
  • 第二步:通过状态实例的属性判断当前状态
    所有跟底部表单相关的状态都存在scaffoldState.bottomSheetState中,常用属性如下:

    • currentValue:类型为BottomSheetValue枚举,代表当前稳定停驻的状态,枚举值Collapsed对应折叠态,Expanded对应展开态
    • targetValue:拖拽过程中可通过该属性获取松手后表单会最终停驻的目标状态,无需等待回弹动画执行完成
    • progress:0f-1f之间的浮点数,0f代表完全折叠,1f代表完全展开,拖拽、动画过程中会实时更新,可用来做跟拖拽进度绑定的自定义效果
    • isAnimationRunning:布尔值,标识当前是否处于展开/折叠的动画执行过程中
  • 状态变化监听示例
    如果需要在状态切换时触发业务逻辑,用snapshotFlow监听状态变化即可,避免重组阶段的重复计算:

LaunchedEffect(scaffoldState.bottomSheetState) {
    snapshotFlow { scaffoldState.bottomSheetState.currentValue }
        .collect { state ->
            when(state) {
                BottomSheetValue.Collapsed -> {
                    // 折叠状态触发的逻辑
                }
                BottomSheetValue.Expanded -> {
                    // 展开状态触发的逻辑
                }
            }
        }
}

注意:不要自行给sheetContent添加拖拽相关的Modifier做手势拦截,会和组件内置的拖拽逻辑冲突,导致状态错乱。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 19:01:21