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) } }
关键说明
skipHiddenState = true:这会让BottomSheet直接忽略Hidden状态,仅保留PartiallyExpanded和Expanded,从根源上避免状态跳转到Hidden导致的peek高度失效。- 状态持久化:
rememberBottomSheetScaffoldState和rememberStandardBottomSheetState会自动保存状态,从其他页面返回时会恢复到离开前的状态,sheetPeekHeight配置始终生效。 - 可选优化:如果需要跳转前将Sheet折叠到peek状态,可通过
coroutineScope调用partialExpand(),提升用户体验。
内容的提问来源于stack exchange,提问作者AnnBuiii
相关产品推荐
相关产品推荐

