skydoves / FlexibleBottomSheet

🐬 Advanced Compose Multiplatform bottom sheet for segmented sizing, non-modal type, and allows interaction behind the bottom sheet similar to Google Maps.
Apache License 2.0
687 stars 30 forks source link

Skip Hidden State #17

Closed koreatlwls closed 2 weeks ago

koreatlwls commented 5 months ago

현재 카카오 티 앱의 주차 기능에서 처럼 flexible한 bottom sheet + No Hidden State인 BottomSheet 구현을 할 수 있게 skipHiddenState에 대해서 제안드립니다.

@Composable
fun rememberFlexibleBottomSheetState(
    skipIntermediatelyExpanded: Boolean = false,
    skipSlightlyExpanded: Boolean = true,
    skipHiddenState: Boolean = false,
    isModal: Boolean = false,
    containSystemBars: Boolean = false,
    allowNestedScroll: Boolean = true,
    animateSpec: AnimationSpec<Float> = SwipeableV2Defaults.AnimationSpec,
    flexibleSheetSize: FlexibleSheetSize = FlexibleSheetSize(),
    confirmValueChange: (FlexibleSheetValue) -> Boolean = { true },
    initialValue: FlexibleSheetValue = FlexibleSheetValue.IntermediatelyExpanded,
): FlexibleSheetState = rememberFlexibleSheetState(
    skipIntermediatelyExpanded = skipIntermediatelyExpanded,
    skipSlightlyExpanded = skipSlightlyExpanded,
    isModal = isModal,
    animateSpec = animateSpec,
    confirmValueChange = confirmValueChange,
    flexibleSheetSize = flexibleSheetSize,
    containSystemBars = containSystemBars,
    allowNestedScroll = allowNestedScroll,
    initialValue = initialValue,
    skipHiddenState = skipHiddenState,
)

private rememberFlexibleBottomSheetState()의 경우에는 skipHiddenState에 해당하는 파라미터가 있던데 public rememberFlexibleBottomSheetState()의 경우에는 skipHiddenState가 파라미터에 없어 추가를 하였습니다.

fun Modifier.flexibleBottomSheetSwipeable(
    sheetState: FlexibleSheetState,
    flexibleSheetSize: FlexibleSheetSize,
    anchorChangeHandler: AnchorChangeHandler<FlexibleSheetValue>,
    sheetFullHeight: Float,
    sheetConstraintHeight: Float,
    screenMaxHeight: Float,
    isModal: Boolean,
    onDragStarted: suspend CoroutineScope.(startedPosition: Offset) -> Unit = {},
    onDragStopped: CoroutineScope.(velocity: Float) -> Unit,
): Modifier = draggable(
    state = sheetState.swipeableState.swipeDraggableState,
    orientation = Orientation.Vertical,
    enabled = sheetState.isVisible,
    startDragImmediately = sheetState.swipeableState.isAnimationRunning,
    onDragStarted = onDragStarted,
    onDragStopped = onDragStopped,
)
    .swipeAnchors(
        state = sheetState.swipeableState,
        anchorChangeHandler = anchorChangeHandler,
        possibleValues = if (sheetState.skipHiddenState) {
            setOf(
                FlexibleSheetValue.IntermediatelyExpanded,
                FlexibleSheetValue.SlightlyExpanded,
                FlexibleSheetValue.FullyExpanded,
            )
        } else {
            setOf(
                FlexibleSheetValue.Hidden,
                FlexibleSheetValue.IntermediatelyExpanded,
                FlexibleSheetValue.SlightlyExpanded,
                FlexibleSheetValue.FullyExpanded,
            )
        },
    ) { value, sheetSize ->

.... 생략

skipHiddenState의 값에따라 possibleValues를 다르게하여 보았습니다.

skydoves commented 4 weeks ago

Hi @koreatlwls, apologies for the delayed response. Since version 0.1.3, you can prevent the bottom sheet from hiding and keep it displayed across user actions by setting the skipHiddenState property to true.

val sheetState = rememberFlexibleBottomSheetState(
    skipHiddenState = true,
    ..
)

I appreciate your patience!