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

