Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implementing Bottom Sheet Scrim Display Upon Expansion #15

Open
ghasemdev opened this issue Dec 27, 2023 · 6 comments
Open

Implementing Bottom Sheet Scrim Display Upon Expansion #15

ghasemdev opened this issue Dec 27, 2023 · 6 comments

Comments

@ghasemdev
Copy link

Is your feature request related to a problem?

When we pull down the bottom sheet and hold it, even though the bottom sheet exists, it is possible to click behind it and navigate to another page, and then reopen the bottom sheet again, even if it is a modal bottom sheet.

Describe the solution you'd like:

Describe alternatives you've considered:

@skydoves
Copy link
Owner

skydoves commented Dec 27, 2023

Hey @ghasemdev, would you elaborate on this? It sounds like this issue should be prevented from the user side. Does this work different from the Material3's ModalBottomSheet?

@ghasemdev
Copy link
Author

ghasemdev commented Dec 28, 2023

I have tested my own scenario, and it appears that you have managed the dragging of the bottom sheet, and clicking on the page is not functional. However, I am curious to know why I still cannot click on the page even if I omit the if-statement related to the absence of the bottom sheet.

var shouldShowBottomSheet by rememberSaveable { mutableStateOf(false) }
val coroutineScope = rememberCoroutineScope()
val bottomSheetState = rememberFlexibleBottomSheetState(
    containSystemBars = true,
    isModal = true,
)

Column(
    modifier = Modifier.fillMaxSize(),
    horizontalAlignment = Alignment.CenterHorizontally
) {
    Button(
        onClick = {
            Toast.makeText(this@MainActivity, "Show Toast", Toast.LENGTH_SHORT).show()
        }
    ) {
        Text(text = "Toast")
    }
     Button(
         onClick = {
             coroutineScope.launch {
                 shouldShowBottomSheet = true
                 delay(50)
                 bottomSheetState.intermediatelyExpand()
             }
         }
    ) {
        Text(text = "Show Bottom Sheet")
    }
}

if (shouldShowBottomSheet) {
    FlexibleBottomSheet(
        onDismissRequest = {
            shouldShowBottomSheet = false
        },
        sheetState = bottomSheetState,
        scrimColor = Color.Black.copy(.7f),
        containerColor = Color.LightGray
    ) {
       Column(
           modifier = Modifier.fillMaxWidth(),
           horizontalAlignment = Alignment.CenterHorizontally
       ) {
            Text(text = "sheet")
          } 
      }
}

@ghasemdev
Copy link
Author

ghasemdev commented Dec 28, 2023

Screen_Recording_20231228_230923_affogato.mp4

@skydoves
It seems like in the XML, the scrim doesn’t disappear when the bottom sheet is in the hiding process. 🤔

@ghasemdev
Copy link
Author

I have tested my own scenario, and it appears that you have managed the dragging of the bottom sheet, and clicking on the page is not functional. However, I am curious to know why I still cannot click on the page even if I omit the if-statement related to the absence of the bottom sheet.

var shouldShowBottomSheet by rememberSaveable { mutableStateOf(false) }
val coroutineScope = rememberCoroutineScope()
val bottomSheetState = rememberFlexibleBottomSheetState(
    containSystemBars = true,
    isModal = true,
)

Column(
    modifier = Modifier.fillMaxSize(),
    horizontalAlignment = Alignment.CenterHorizontally
) {
    Button(
        onClick = {
            Toast.makeText(this@MainActivity, "Show Toast", Toast.LENGTH_SHORT).show()
        }
    ) {
        Text(text = "Toast")
    }
     Button(
         onClick = {
             coroutineScope.launch {
                 shouldShowBottomSheet = true
                 delay(50)
                 bottomSheetState.intermediatelyExpand()
             }
         }
    ) {
        Text(text = "Show Bottom Sheet")
    }
}

if (shouldShowBottomSheet) {
    FlexibleBottomSheet(
        onDismissRequest = {
            shouldShowBottomSheet = false
        },
        sheetState = bottomSheetState,
        scrimColor = Color.Black.copy(.7f),
        containerColor = Color.LightGray
    ) {
       Column(
           modifier = Modifier.fillMaxWidth(),
           horizontalAlignment = Alignment.CenterHorizontally
       ) {
            Text(text = "sheet")
          } 
      }
}

My implementation had a problem, but after reading the Material Design 3 documentation, I realized the need for an if-statement and a boolean variable.

var shouldShowBottomSheet by rememberSaveable { mutableStateOf(false) }
val coroutineScope = rememberCoroutineScope()
val bottomSheetState = rememberFlexibleBottomSheetState(
    containSystemBars = true,
    isModal = true,
)

Column(
    modifier = Modifier.fillMaxSize(),
    horizontalAlignment = Alignment.CenterHorizontally
) {
    Button(
        onClick = {
            Toast.makeText(this@MainActivity, "Show Toast", Toast.LENGTH_SHORT).show()
        }
    ) {
        Text(text = "Toast")
    }
     Button(
         onClick = {
              shouldShowBottomSheet = true
         }
    ) {
        Text(text = "Show Bottom Sheet")
    }
}

if (shouldShowBottomSheet) {
    FlexibleBottomSheet(
        onDismissRequest = {
            shouldShowBottomSheet = false
        },
        sheetState = bottomSheetState,
        scrimColor = Color.Black.copy(.7f),
        containerColor = Color.LightGray
    ) {
       Column(
           modifier = Modifier.fillMaxWidth(),
           horizontalAlignment = Alignment.CenterHorizontally
       ) {
            Button(
                  onClick = {
                    coroutineScope.launch { bottomSheetState.hide() }.invokeOnCompletion {
                      if (!bottomSheetState.isVisible) {
                        showBottomSheet = false
                      }
                    }
                  }
                ) {
                  Text(text = "Hide")
                }
          } 
      }
}

@ghasemdev
Copy link
Author

Another question has arisen for me: how can one disable the ‘dragGesture’? In the Material 2 bottom sheet, we had the capability to disable this feature to prevent the bottom sheet from closing when dragged.

@ghasemdev
Copy link
Author

ghasemdev commented Dec 29, 2023

Another question has arisen for me: how can one disable the ‘dragGesture’? In the Material 2 bottom sheet, we had the capability to disable this feature to prevent the bottom sheet from closing when dragged.

For now, I am using this method.

 val bottomSheetState = rememberModalBottomSheetState(
        skipPartiallyExpanded = true,
        confirmValueChange = {
          // Prevent collapsing by swipe down gesture
          if (!isDraggable) it != FlexibleSheetValue.IntermediatelyExpanded else true
        }
 )

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants