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

Jetpack Compose:返回页面后BottomSheetScaffold丢失sheetPeekHeight的解决咨询

解决Compose Material3 BottomSheetScaffold从其他页面返回后丢失sheetPeekHeight的问题

问题根源在于:默认的StandardBottomSheetState仍保留Hidden状态支持,从其他页面返回时组件重组可能触发状态意外切换到Hidden,导致sheetPeekHeight的配置失效。

解决方案

核心是禁用Hidden状态,确保BottomSheet仅在PartiallyExpanded(对应peek高度)和Expanded两种状态间切换,同时保留返回后的状态一致性。

修改你的代码如下:

@ExperimentalMaterial3Api
@Composable
fun ScreenA(
    navController: NavController
) {
    val coroutineScope = rememberCoroutineScope()
    val scaffoldState = rememberBottomSheetScaffoldState(
        bottomSheetState = rememberStandardBottomSheetState(
            initialValue = SheetValue.Expanded,
            skipHiddenState = true, // 关键:彻底禁用Hidden状态
            confirmValueChange = { newState ->
                // 仅允许在预期的两种状态间切换
                newState in setOf(SheetValue.Expanded, SheetValue.PartiallyExpanded)
            }
        )
    )

    BottomSheetScaffold(
        scaffoldState = scaffoldState,
        sheetPeekHeight = 128.dp,
        sheetContent = {
            Box(
                Modifier
                    .fillMaxWidth()
                    .height(128.dp),
                contentAlignment = Alignment.Center
            ) {
                Text("Swipe up to expand sheet")
            }
            Column(
                Modifier
                    .fillMaxWidth()
                    .padding(64.dp),
                horizontalAlignment = Alignment.CenterHorizontally
            ) {
                Text("Sheet content")
                Spacer(Modifier.height(20.dp))
                Button(
                    onClick = {
                        // 可选:跳转前将Sheet折叠到peek状态
                        coroutineScope.launch {
                            scaffoldState.bottomSheetState.partialExpand()
                        }
                        navController.navigate("ScreenB")
                    }
                ) {
                    Text("Click to collapse sheet")
                }
            }
        }) { innerPadding ->
        Box(Modifier.padding(innerPadding)) {
            Text("Scaffold Content")
        }
    }
    LaunchedEffect(scaffoldState.bottomSheetState.currentValue) {
        println(scaffoldState.bottomSheetState.currentValue)
    }
}

关键说明

  1. skipHiddenState = true:这会让BottomSheet直接忽略Hidden状态,仅保留PartiallyExpanded和Expanded,从根源上避免状态跳转到Hidden导致的peek高度失效。
  2. 状态持久化:rememberBottomSheetScaffoldState和rememberStandardBottomSheetState会自动保存状态,从其他页面返回时会恢复到离开前的状态,sheetPeekHeight配置始终生效。
  3. 可选优化:如果需要跳转前将Sheet折叠到peek状态,可通过coroutineScope调用partialExpand(),提升用户体验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 06:45:28