BottomSheetScaffold 导航回来时不会保留sheetPeekHeight (Jetpack Compose)

问题描述 投票:0回答:2

根据 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
    }
}
android-jetpack-compose android-jetpack material3
2个回答
0
投票

这应该有帮助:

 val scaffoldSheetState = rememberBottomSheetScaffoldState(
        SheetState(
            skipHiddenState = true,
            skipPartiallyExpanded = false,
            initialValue = SheetValue.PartiallyExpanded
        )
    )

来自文档:skipHiddenState - 是否应跳过隐藏状态。如果为 true,则工作表将始终展开到“已展开”状态,并以编程方式或通过用户交互移动到“部分展开”(如果可用)。


0
投票

我遇到了类似的问题,事实证明,重新创建 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 的未来版本中修复

© www.soinside.com 2019 - 2024. All rights reserved.