如何实现ModalBottomSheet的scrimColor全屏显示且Sheet高度为窗口减状态栏
解决方法
你可以通过以下步骤实现需求:
- 保留让scrim覆盖状态栏的
windowInsets设置(即BottomSheetDefaults.windowInsets.only(WindowInsetsSides.Bottom)) - 获取状态栏高度,给
ModalBottomSheet的modifier添加顶部内边距,让整个sheet(包括拖拽柄)下移至状态栏下方 - 这样既保证scrim铺满全屏,又能让sheet高度自动适配为窗口高度减去状态栏高度
具体代码示例
import androidx.compose.foundation.layout.padding import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.BottomSheetDefaults import androidx.compose.material3.Text import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalWindowInsets // 在Composable函数内部 val statusBarHeight = LocalWindowInsets.current.statusBars.top.dp ModalBottomSheet( sheetState = state, onDismissRequest = {}, windowInsets = BottomSheetDefaults.windowInsets.only(WindowInsetsSides.Bottom), modifier = Modifier.padding(top = statusBarHeight) ) { Text("Hello World") }
补充说明
- 若不想手动计算状态栏高度,也可直接使用
WindowInsets.statusBars的padding值,但需注意要作用于整个sheet容器而非仅内容区域 - 确保你的Activity主题已设置透明状态栏(比如在
res/values/styles.xml中添加<item name="android:statusBarColor">@android:color/transparent</item>),否则scrim可能仍无法正常显示在状态栏后方
内容的提问来源于stack exchange,提问作者Sven
相关产品推荐
相关产品推荐

