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.x
和 1.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,
)
)
在 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.x
和 1.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,
)
)