根据 AndroidX Compose Material 3 示例,这个
BottomSheetScaffold
的 peekHeight
= 128dp。此时它只有两个state
:Expanded
和PartiallyExpanded
。当我导航到另一个屏幕然后返回时,BottomSheetScaffold
似乎失去了 peekHeight
,现在它可以是 Hidden
。我有我的解决方案,但这并不完全是我想要的。在这种情况下我该如何保持peekHeight
?
这是我的代码
@ExperimentalMaterial3Api
@Composable
fun ScreenA(
navController: NavController
) {
val scaffoldState = rememberBottomSheetScaffoldState(
bottomSheetState = rememberStandardBottomSheetState(
initialValue = SheetValue.Expanded,
confirmValueChange = {
it != SheetValue.Hidden // Prevent collapsing but not what I want
}
)
)
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 = {
navController.navigate("ScreenB") // navigate to another screen
}
) {
Text("Click to collapse sheet")
}
}
}) { innerPadding ->
Box(Modifier.padding(innerPadding)) {
Text("Scaffold Content")
}
}
LaunchedEffect(scaffoldState.bottomSheetState.currentValue) {
println(scaffoldState.bottomSheetState.currentValue) // check scaffold state
}
}
这应该有帮助:
val scaffoldSheetState = rememberBottomSheetScaffoldState(
SheetState(
skipHiddenState = true,
skipPartiallyExpanded = false,
initialValue = SheetValue.PartiallyExpanded
)
)
来自文档:skipHiddenState - 是否应跳过隐藏状态。如果为 true,则工作表将始终展开到“已展开”状态,并以编程方式或通过用户交互移动到“部分展开”(如果可用)。
我遇到了类似的问题,事实证明,重新创建 Activity 时,
skipHiddenState
无法恢复。
我引入了一个自定义函数而不是rememberStandardBottomSheetState()
来保存和恢复参数。
@Composable
@ExperimentalMaterial3Api
fun rememberCustomBottomSheetState(
skipPartiallyExpanded: Boolean = false,
confirmValueChange: (SheetValue) -> Boolean = { true },
initialValue: SheetValue = SheetValue.PartiallyExpanded,
skipHiddenState: Boolean = true,
): SheetState {
return rememberSaveable(
skipPartiallyExpanded, skipHiddenState, confirmValueChange,
saver = Saver(
save = { it.currentValue },
restore = { savedValue ->
SheetState(skipPartiallyExpanded, savedValue, confirmValueChange, skipHiddenState)
}
)
) {
SheetState(skipPartiallyExpanded, initialValue, confirmValueChange, skipHiddenState)
}
}
返回的状态可以传递给脚手架状态
val bottomSheetState = rememberCustomBottomSheetState()
val scaffoldState = rememberBottomSheetScaffoldState(
bottomSheetState = bottomSheetState
)
我已将问题提交给问题跟踪器。可能会在 Material3 的未来版本中修复