Riquadro di navigazione a scomparsa

Il componente riquadro di navigazione a scomparsa è un menu a scomparsa che consente agli utenti di navigare in varie sezioni dell'app. Gli utenti possono attivarlo scorrendo dal lato o toccando un'icona di menu.

Considera questi tre casi d'uso per l'implementazione di un riquadro di navigazione a scomparsa:

  • Organizzazione dei contenuti:consenti agli utenti di passare da una categoria all'altra, ad esempio nelle app di notizie o di blog.
  • Gestione dell'account:fornisci link rapidi alle impostazioni dell'account e alle sezioni del profilo nelle app con account utente.
  • Scoperta di funzionalità:organizza più funzionalità e impostazioni in un unico menu per facilitare la scoperta e l'accesso degli utenti in app complesse.

In Material Design esistono due tipi di riquadri di navigazione a scomparsa:

  • Standard:condividi lo spazio all'interno di uno schermo con altri contenuti.
  • Modale:viene visualizzato sopra altri contenuti all'interno di una schermata.
Esempio di riquadro di navigazione a scomparsa di Material Design 3 in modalità Luce e Buio.
Figura 1. Esempio di riquadro di navigazione a scomparsa.

Esempio

Puoi utilizzare il componibile ModalNavigationDrawer per implementare un riquadro di navigazione a scomparsa.

Utilizza lo slot drawerContent per fornire un ModalDrawerSheet e i contenuti del riquadro a scomparsa, come nell'esempio seguente:

ModalNavigationDrawer(
    drawerContent = {
        ModalDrawerSheet {
            Text("Drawer title", modifier = Modifier.padding(16.dp))
            HorizontalDivider()
            NavigationDrawerItem(
                label = { Text(text = "Drawer Item") },
                selected = false,
                onClick = { /*TODO*/ }
            )
            // ...other drawer items
        }
    }
) {
    // Screen content
}

ModalNavigationDrawer accetta una serie di parametri aggiuntivi per il carrello. Ad esempio, puoi attivare o disattivare la risposta del riquadro a scomparsa ai trascinamenti con il parametro gesturesEnabled, come nell'esempio seguente:

ModalNavigationDrawer(
    drawerContent = {
        ModalDrawerSheet {
            // Drawer contents
        }
    },
    gesturesEnabled = false
) {
    // Screen content
}

Controlla il comportamento

Per controllare l'apertura e la chiusura del riquadro a scomparsa, utilizza DrawerState. Devi passare un DrawerState a ModalNavigationDrawer utilizzando il parametro drawerState.

DrawerState fornisce l'accesso alle funzioni open e close, nonché alle proprietà relative allo stato corrente del riquadro a scomparsa. Queste funzioni di sospensione richiedono un CoroutineScope, di cui puoi creare un'istanza utilizzando rememberCoroutineScope. Puoi anche chiamare le funzioni di sospensione in risposta agli eventi della UI.

val drawerState = rememberDrawerState(initialValue = DrawerValue.Closed)
val scope = rememberCoroutineScope()
ModalNavigationDrawer(
    drawerState = drawerState,
    drawerContent = {
        ModalDrawerSheet { /* Drawer content */ }
    },
) {
    Scaffold(
        floatingActionButton = {
            ExtendedFloatingActionButton(
                text = { Text("Show drawer") },
                icon = { Icon(Icons.Filled.Add, contentDescription = "") },
                onClick = {
                    scope.launch {
                        drawerState.apply {
                            if (isClosed) open() else close()
                        }
                    }
                }
            )
        }
    ) { contentPadding ->
        // Screen content
    }
}

Crea gruppi all'interno di un riquadro di navigazione a scomparsa

Il seguente snippet mostra come creare un riquadro di navigazione a scomparsa dettagliato, con sezioni e divisori:

@Composable
fun DetailedDrawerExample(
    content: @Composable (PaddingValues) -> Unit
) {
    val drawerState = rememberDrawerState(initialValue = DrawerValue.Closed)
    val scope = rememberCoroutineScope()

    ModalNavigationDrawer(
        drawerContent = {
            ModalDrawerSheet {
                Column(
                    modifier = Modifier.padding(horizontal = 16.dp)
                        .verticalScroll(rememberScrollState())
                ) {
                    Spacer(Modifier.height(12.dp))
                    Text("Drawer Title", modifier = Modifier.padding(16.dp), style = MaterialTheme.typography.titleLarge)
                    HorizontalDivider()

                    Text("Section 1", modifier = Modifier.padding(16.dp), style = MaterialTheme.typography.titleMedium)
                    NavigationDrawerItem(
                        label = { Text("Item 1") },
                        selected = false,
                        onClick = { /* Handle click */ }
                    )
                    NavigationDrawerItem(
                        label = { Text("Item 2") },
                        selected = false,
                        onClick = { /* Handle click */ }
                    )

                    HorizontalDivider(modifier = Modifier.padding(vertical = 8.dp))

                    Text("Section 2", modifier = Modifier.padding(16.dp), style = MaterialTheme.typography.titleMedium)
                    NavigationDrawerItem(
                        label = { Text("Settings") },
                        selected = false,
                        icon = { Icon(painter = rememberVectorPainter(AppIcons.Settings), contentDescription = null) },
                        badge = { Text("20") }, // Placeholder
                        onClick = { /* Handle click */ }
                    )
                    NavigationDrawerItem(
                        label = { Text("Help and feedback") },
                        selected = false,
                        icon = { Icon(painter = rememberVectorPainter(AppIcons.Help), contentDescription = null) },
                        onClick = { /* Handle click */ },
                    )
                    Spacer(Modifier.height(12.dp))
                }
            }
        },
        drawerState = drawerState
    ) {
        Scaffold(
            topBar = {
                TopAppBar(
                    title = { Text("Navigation Drawer Example") },
                    navigationIcon = {
                        IconButton(onClick = {
                            scope.launch {
                                if (drawerState.isClosed) {
                                    drawerState.open()
                                } else {
                                    drawerState.close()
                                }
                            }
                        }) {
                            Icon(painter = rememberVectorPainter(AppIcons.Menu), contentDescription = "Menu")
                        }
                    }
                )
            }
        ) { innerPadding ->
            content(innerPadding)
        }
    }
}

Punti chiave sul codice

  • Compila drawerContent con un Column contenente sezioni, divisori ed elementi di navigazione.
  • ModalDrawerSheet fornisce lo stile Material Design per il riquadro a scomparsa.
  • HorizontalDivider separa le sezioni all'interno del riquadro a scomparsa.
  • ModalNavigationDrawer crea il riquadro a scomparsa.
  • drawerContent definisce i contenuti del riquadro a scomparsa.
  • All'interno di ModalDrawerSheet, un Column dispone gli elementi del riquadro a scomparsa in verticale.
  • I componibili NavigationDrawerItem rappresentano i singoli elementi nel riquadro a scomparsa.
  • Scaffold fornisce la struttura di base della schermata, incluso TopAppBar.
  • navigationIcon in TopAppBar controlla lo stato di apertura e chiusura del riquadro a scomparsa.

Risultato

La seguente immagine mostra l'aspetto del riquadro a scomparsa quando viene aperto, con le sezioni e gli elementi visualizzati:

Un riquadro di navigazione a scomparsa dettagliato con due sezioni, ciascuna con più elementi ed icone etichettati.
Figura 2. Un riquadro di navigazione a scomparsa aperto con due gruppi nidificati.

Risorse aggiuntive