How to use Multiple Bottom-sheets in Android Compose

After trying to refactor my project from the normal view system to Android Compose, I can really feel the difference between them.

I feel Android Compose will for sure become the default way to build UI in native android, but it still have a lot of co…


This content originally appeared on DEV Community and was authored by David

After trying to refactor my project from the normal view system to Android Compose, I can really feel the difference between them.

I feel Android Compose will for sure become the default way to build UI in native android, but it still have a lot of cons that Google engineers are trying to solve but till then, I am gonna write on how to solve one of them in this post and it is how to have multiple bottom-sheets in the same app.

Before reading please be careful that this post applies to compose version 1.0.0-beta05.
and is definitely related to these issues:

If these two issues are not solved yet you can continue reading my post, if any of them are solved and it will change the way to support multiple bottom-sheets, I will write another post.

1- Let's start by defining the bottom sheets that we are gonna use in our application

sealed class BottomSheetScreen() {
    object Screen1: BottomSheetScreen()
    object Screen2: BottomSheetScreen()
    class Screen3(val argument:String):BottomSheetScreen()
}

2- We will have a mutable state of our current bottom sheet screen in the top composable function that will show the bottom sheet

@Composable
private fun MainLayout() {
 var currentBottomSheet: BottomSheetScreen by remember{
        mutableStateOf(BottomSheetScreen.Screen1)
    }
}

3- We will use BottomSheetScaffold to handle opening and closing the bottom sheet

   val scaffoldState = rememberBottomSheetScaffoldState()
   BottomSheetScaffold(sheetPeekHeight = 0.dp, scaffoldState = scaffoldState,
        sheetShape = BottomSheetShape,
        sheetContent = {
            SheetLayout(currentBottomSheet,closeSheet)
        }) { paddingValues ->
            Box(Modifier.padding(paddingValues)){
                MainContent(openSheet)
            }
    }

4- Now, We will define two lambdas for opening and closing the bottom sheet

val closeSheet: () -> Unit = {
        scope.launch {
            scaffoldState.bottomSheetState.collapse()

        }
    }


    val openSheet: (BottomSheetScreen) -> Unit = {
        currentBottomSheet = it
        scope.launch { scaffoldState.bottomSheetState.expand() }

    }

Summing it up, our code should be similar to that

@OptIn(ExperimentalMaterialApi::class)
@Composable
private fun MainLayout() {
    val scope = rememberCoroutineScope()
    val scaffoldState = rememberBottomSheetScaffoldState()
    var currentBottomSheet: BottomSheetScreen by remember{
        mutableStateOf(BottomSheetScreen.Screen1)
    }



    val closeSheet: () -> Unit = {
        scope.launch {
            scaffoldState.bottomSheetState.collapse()

        }
    }


    val openSheet: (BottomSheetScreen) -> Unit = {
        currentBottomSheet = it
        scope.launch { scaffoldState.bottomSheetState.expand() }

    }

    BottomSheetScaffold(sheetPeekHeight = 0.dp, scaffoldState = scaffoldState,
        sheetShape = BottomSheetShape,
        sheetContent = {
            SheetLayout(currentBottomSheet,closeSheet)
        }) { paddingValues ->
            Box(Modifier.padding(paddingValues)){
                MainContent(openSheet)
            }
    }
}

5- Now we will define our SheetLayout, as we can see from the above code that it takes two parameters

  • The current bottom sheet
  • The closeSheet lambda, because if we want to have a button to close the sheet

It should be similar to that

@Composable
fun SheetLayout(currentScreen: BottomSheetScreen,onCloseBottomSheet :()->Unit) {
    BottomSheetWithCloseDialog(onCloseBottomSheet){
        when(currentScreen){
            BottomSheetScreen.Screen1 -> Screen1()
            BottomSheetScreen.Screen2 -> Screen2()
            is BottomSheetScreen.Screen3 -> Screen3(argument = currentScreen.argument)
        }

    }
}

6- Finally last step we define MainContent composable function that takes openSheet as a parameter

@Composable
fun MainContent(openSheet: (BottomSheetScreen) -> Unit) {
    Column(Modifier.fillMaxSize(),verticalArrangement = Arrangement.SpaceEvenly,horizontalAlignment = Alignment.CenterHorizontally) {
        Text(text = "This is Main Content")
        Button(onClick = { openSheet(BottomSheetScreen.Screen1) }) {
            Text(text = "Open bottom sheet 1")
        }

        Button(onClick = { openSheet(BottomSheetScreen.Screen2) }) {
            Text(text = "Open bottom sheet 2")
        }
        Button(onClick = { openSheet(BottomSheetScreen.Screen3("this is an argument")) }) {
            Text(text = "Open bottom sheet 2")
        }
    }
}

And now we can easily build an app that contains multiple bottom sheets as below
ss

NB: Here is the whole project used in the Demo on Github

Thanks for reading ?‍?


This content originally appeared on DEV Community and was authored by David


Print Share Comment Cite Upload Translate Updates
APA

David | Sciencx (2021-05-07T12:53:36+00:00) How to use Multiple Bottom-sheets in Android Compose. Retrieved from https://www.scien.cx/2021/05/07/how-to-use-multiple-bottom-sheets-in-android-compose/

MLA
" » How to use Multiple Bottom-sheets in Android Compose." David | Sciencx - Friday May 7, 2021, https://www.scien.cx/2021/05/07/how-to-use-multiple-bottom-sheets-in-android-compose/
HARVARD
David | Sciencx Friday May 7, 2021 » How to use Multiple Bottom-sheets in Android Compose., viewed ,<https://www.scien.cx/2021/05/07/how-to-use-multiple-bottom-sheets-in-android-compose/>
VANCOUVER
David | Sciencx - » How to use Multiple Bottom-sheets in Android Compose. [Internet]. [Accessed ]. Available from: https://www.scien.cx/2021/05/07/how-to-use-multiple-bottom-sheets-in-android-compose/
CHICAGO
" » How to use Multiple Bottom-sheets in Android Compose." David | Sciencx - Accessed . https://www.scien.cx/2021/05/07/how-to-use-multiple-bottom-sheets-in-android-compose/
IEEE
" » How to use Multiple Bottom-sheets in Android Compose." David | Sciencx [Online]. Available: https://www.scien.cx/2021/05/07/how-to-use-multiple-bottom-sheets-in-android-compose/. [Accessed: ]
rf:citation
» How to use Multiple Bottom-sheets in Android Compose | David | Sciencx | https://www.scien.cx/2021/05/07/how-to-use-multiple-bottom-sheets-in-android-compose/ |

Please log in to upload a file.




There are no updates yet.
Click the Upload button above to add an update.

You must be logged in to translate posts. Please log in or register.