如何让Jetpack Compose的ModalBottomSheetLayout始终保持Expanded全展开
解决方案
从你贴出的源码逻辑可以看到,默认的show()方法会优先判断锚点中是否存在半展开状态,存在的话就会默认跳到半展开,只要绕过这个判断逻辑就能实现始终全展开的需求。
方案1:直接指定目标状态唤起(最简便)
不要调用系统提供的show()方法,在协程作用域中直接调用animateTo方法指定目标状态为全展开即可,不受内容高度影响:
val coroutineScope = rememberCoroutineScope() val sheetState = rememberModalBottomSheetState(initialValue = ModalBottomSheetValue.Hidden) // 触发弹窗唤起的位置执行以下逻辑 coroutineScope.launch { // 替换原有sheetState.show()写法 sheetState.animateTo(ModalBottomSheetValue.Expanded) }
方案2:封装扩展方法统一调用
如果项目多处都需要全展开唤起的逻辑,可以给ModalBottomSheetState扩展一个专用方法:
suspend fun ModalBottomSheetState.fullyShow() { animateTo(ModalBottomSheetValue.Expanded) }
后续唤起弹窗直接调用sheetState.fullyShow()即可,和原有调用习惯保持一致。
补充:完全禁用半展开状态
如果不仅需要唤起时全展开,还要禁止用户滑动时停在半展开位置,可以选择以下方式:
- 升级使用Compose Material 3的ModalBottomSheet组件,该组件已提供
skipHalfExpanded配置参数,设置为true即可全局禁用半展开逻辑 - 复制原生ModalBottomSheetLayout的源码,删除锚点生成逻辑中HalfExpanded相关的分支即可
内容的提问来源于stack exchange,提问作者Marat
相关产品推荐
相关产品推荐

