Search code examples
androidandroid-jetpack-composenavigation-drawerandroid-compose-appbar

Add drawer toggle button in Jetpack compose


I want to add the hamburger icon to the Appbar and open/close drawer using the icon.

How would I achieve this?

Scaffold(
    drawerShape = RoundedCornerShape(topRight = 10.dp, bottomRight = 10.dp),
    drawerElevation = 5.dp,
    drawerContent = {
      // Drawer
    },
    topBar = {
      TopAppBar(
        navigationIcon = {
          Icon(
            Icons.Default.Menu,
            modifier = Modifier.clickable(onClick = {
              // Open drawer => How?
            })
          )
        },

        modifier = Modifier
          .fillMaxWidth()
          .clip(RoundedCornerShape(bottomLeft = 10.dp, bottomRight = 10.dp)),
        title = { Text(text = "Hello") }
      )
    },
  ) {}


Solution

  • Use rememberScaffoldState() to modify drawer state.

    1. create a variable:
    val state = rememberScaffoldState()
    val scope = rememberCoroutineScope() // in 1.0.0-beta `open()` and `close` are suspend functions
    
    1. Pass the state to Scaffold
    Scaffold(
       scaffoldState = state,
       // ...
    )
    
    1. Use state.drawerState.open() or state.drawerState.close() in an onClick to open/close the drawer.

    2. Create an Icon for navigationIcon in TopAppBar:

    val state = rememberScaffoldState()
    Scaffold(
      scaffoldState = state,
      topBar = {
        TopAppBar(
          title = { Text(text = "AppBar") },
          navigationIcon = {
            Icon(
              Icons.Default.Menu,
              modifier = Modifier.clickable(onClick = {
                scope.launch { if(it.isClosed) it.open() else it.close() }
              })
            )
          }
        )
      },
      drawerShape = RoundedCornerShape(topRight = 10.dp, bottomRight = 10.dp),
      drawerContent = {
        Text(text = "Drawer")
      }
    ) {
       // Scaffold body
    }