BottomSheetScaffold 的工作表在重组时自动扩展

Don*_*dal 6 bottom-sheet material-components-android android-jetpack-compose

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

BottomSheetScaffold(
    sheetContent = { SheetContent(sheetData = viewModel.sheetData) }
) {}
Run Code Online (Sandbox Code Playgroud)

因此,每当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) {}
}
Run Code Online (Sandbox Code Playgroud)

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

Gab*_*tti 6

这似乎是一个错误。
目前(1.0.x1.1.0-alpha01)当sheetContentHeight<时就会发生这种情况sheetPeekHeight
在这种情况下,如果不显示内容表,scaffoldState.bottomSheetState结果也是如此。expanded

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

sheetBackgroundColor = if (scaffoldState.bottomSheetState.isCollapsed) Color.LightGray else Color.Yellow
Run Code Online (Sandbox Code Playgroud)

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)
            }
        }
  }
Run Code Online (Sandbox Code Playgroud)