我使用 Material 3
BottomSheetScaffold
并需要在选择项目以显示其内容时打开它。当项目未被选中时,BottomSheet
正在关闭。当用户手动关闭BottomSheet
时,不应选择任何项目。此外,如果用户展开BottomSheet
,它会为下一个选定项目保持此状态。我的代码是下一个:
val selectedItem by viewModel.selectedItem.collectAsState()
val bottomSheetState = rememberStandardBottomSheetState(
initialValue = SheetValue.Hidden,
skipHiddenState = false
)
LaunchedEffect(bottomSheetState.currentValue) {
if (bottomSheetState.currentValue == SheetValue.Hidden ) {
viewModel.selectItem(null)
}
}
if (selectedItem == null) {
LaunchedEffect(bottomSheetState.currentValue) { bottomSheetState.hide() }
}
val bottomSheetScaffoldState = rememberBottomSheetScaffoldState(bottomSheetState)
BottomSheetScaffold(
modifier = Modifier.navigationBarsPadding().imePadding(),
scaffoldState = bottomSheetScaffoldState,
sheetPeekHeight = Dimens.bottomSheetPeekHeight,
sheetContainerColor = MaterialTheme.colorScheme.background,
sheetContent = { selectedItem?.let { ItemView(it) } },
错误是:此代码在用户关闭后执行额外次数
BottomSheet
。 BottomSheet 切换到以下状态:Hidden、Hidden、PartiallyExpanded、Hidden。如何修复它或者可能有更优化的解决方案?
对于这种情况,我做了一个组合状态和一个更新状态标志:
fun selectItem(value: Item?, updateState: Boolean = true) {
_selectedItem.value = value
if (updateState) mainUiState.value = MainUiState(selectedItem.value, uiVisible.value, loadingStatus.value)
}
还添加了其他变量的监听器:
init {
viewModelScope.launch {
// Combines the latest value from each of the flows, allowing us to generate a
// view state instance which only contains the latest values.
combine(uiVisible, loadingStatus) { uiVisible, loadingStatus ->
MainUiState(selectedItem.value, uiVisible, loadingStatus)
}.collect {
mainUiState.value = it
}
}
}