Sheet of BottomSheet脚手架在重组时自动扩展

Sheet of BottomSheetScaffold automatically expands on recomposition

在 Jetpack Compose 中,我有一个包含一些内容的 BottomSheetScaffold。这个内容是从ViewModel中观察到的,像这样:

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

因此,每当 viewModel.sheetData 发生变化时,都会触发重组。每当发生这种情况时,底部 sheet 会自动展开。这是错误还是功能?我可以禁用它吗?我使用的是最新版本: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个文本的sheet会自动展开。

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

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

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

addSheetData == false时背景颜色变为Yellow。当您重组可组合项时,由于状态已展开,内容 sheet 已完全展开。

作为解决方法,您可以使用类似的方法:

  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)
            }
        }
  }

尝试添加初始值:

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