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

Jetpack Compose中如何让Material3底部弹窗置于底部导航栏上方且可拖拽?

解决Jetpack Compose Material3底部弹窗遮挡导航栏的问题

方案一:使用官方ModalBottomSheetLayout(推荐)

Material3的ModalBottomSheetLayout会自动适配Scaffold的底部导航栏高度,让弹窗停在导航栏上方,且自带拖拽折叠功能,无需手动计算偏移量。

代码示例:

val navController = rememberNavController()
// 控制底部弹窗状态,允许部分展开
val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = false)
val scope = rememberCoroutineScope()

// 用ModalBottomSheetLayout包裹整个Scaffold
ModalBottomSheetLayout(
    sheetState = sheetState,
    // 你的底部弹窗内容
    sheetContent = {
        BottomSheetUi()
    }
) {
    Scaffold(
        bottomBar = {
            NavigationBarComponent(navController = navController)
        }
    ) { innerPadding ->
        Background(Modifier.padding(innerPadding)) {
            EVBackground {
                // 页面内容区域
                // 调用此方法打开弹窗:scope.launch { sheetState.show() }
                // 关闭弹窗:scope.launch { sheetState.hide() }
            }
        }
    }
}

方案二:自定义BottomSheet时手动计算偏移

如果是自己实现的底部弹窗,需要获取导航栏高度并设置底部偏移:

  1. 获取Material3导航栏的默认高度:
val bottomBarHeight = with(LocalDensity.current) {
    NavigationBarDefaults.Height.toPx()
}
  1. 给自定义BottomSheet添加底部内边距:
BottomSheetUi(
    modifier = Modifier.padding(bottom = bottomBarHeight)
)

或者通过偏移调整位置:

BottomSheetUi(
    modifier = Modifier.offset(y = -bottomBarHeight)
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 14:52:18