【问题标题】:Sheet of BottomSheetScaffold automatically expands on recompositionBottomSheetScaffold 表在重新组合时自动扩展
【发布时间】:2021-08-17 14:25:14
【问题描述】:

在 Jetpack Compose 中,我有一个带有一些内容的 BottomSheetScaffold。此内容是从 ViewModel 中观察到的,如下所示:

BottomSheetScaffold(
    sheetContent = { SheetContent(sheetData = viewModel.sheetData) }
) {}

因此,每当viewModel.sheetData 发生变化时,就会触发重组。每当发生这种情况时,底部工作表会自动展开。这是错误还是功能?我可以禁用这个吗?我正在使用最新版本:1.1.0-alpha01

编辑:这是一个使用 LaunchedEffect 代替 ViewModel 的示例。

@OptIn(ExperimentalMaterialApi::class)
@Preview
@Composable
fun HomeScreen() {
    var addSheetData by remember { mutableStateOf(false) }

    LaunchedEffect(true) {
        delay(2000)
        addSheetData = true
    }

    BottomSheetScaffold(sheetContent = {
        if (addSheetData) {
            Column {
                Text(text = "Text1", fontSize = 36.sp)
                Text(text = "Text2", fontSize = 36.sp)
                Text(text = "Text3", fontSize = 36.sp)
                Text(text = "Text4", fontSize = 36.sp)
                Text(text = "Text5", fontSize = 36.sp)
            }
        }
    }, sheetBackgroundColor = Color.LightGray) {}
}

包含 5 个文本的工作表会自动展开。

【问题讨论】:

  • 如果您希望您的问题得到解答,您需要让专家尽快获得具有可重现问题的工作样本。完美地,我应该将您的代码粘贴到我的示例项目中,并在我运行它时尽快看到问题。请将您的代码更新为minimal reproducible example。它应该包括字符串/数字等示例数据,您可以使用LaunchedEffect 随着时间的推移对其进行更新
  • @Philip 根据要求添加了一个示例。

标签: android-jetpack-compose material-components-android bottom-sheet


【解决方案1】:

这似乎是一个错误。
目前(1.0.x1.1.0-alpha01)它发生在 sheetContentHeight sheetPeekHeight。
在这种情况下,scaffoldState.bottomSheetState 的结果是 expanded,如果没有显示内容表。

您可以在代码中轻松验证它:

sheetBackgroundColor = if (scaffoldState.bottomSheetState.isCollapsed) Color.LightGray else Color.Yellow

addSheetData == false 时,背景颜色变为Yellow。重构可组合对象时,由于状态已展开,因此内容表已完全展开。

作为解决方法,您可以使用以下方法:

  sheetContent = { 
        if (!addSheetData){
            Box(Modifier.fillMaxWidth().height(60.dp))
        }    

        if (addSheetData) {
            Column {
                Text(text = "Text1", fontSize = 36.sp)
                Text(text = "Text2", fontSize = 36.sp)
                Text(text = "Text3", fontSize = 36.sp)
                Text(text = "Text4", fontSize = 36.sp)
                Text(text = "Text5", fontSize = 36.sp)
            }
        }
  }

【讨论】:

  • 有趣!显然它总是以扩展的方式开始,真的很奇怪。我现在将使用此解决方法,非常感谢!
【解决方案2】:

尝试添加一个初始值:

val bottomSheetScaffoldState = rememberBottomSheetScaffoldState(
        bottomSheetState = BottomSheetState(
            initialValue = BottomSheetValue.Collapsed,
        )
    )

【讨论】:

  • 很遗憾,这并没有解决问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-12
  • 1970-01-01
  • 2012-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多