仅当项目被选中时才显示 BottomSheet

问题描述 投票:0回答:1

我使用 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。如何修复它或者可能有更优化的解决方案?

android android-jetpack-compose bottom-sheet material3
1个回答
0
投票

对于这种情况,我做了一个组合状态和一个更新状态标志:

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
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.