Menu
CoddyTech

Uma gaveta lateral

Parte da seção Listas e telas do Journey de Flutter da Coddy. Lição 25 de 33.

Um Drawer é um painel que desliza pela lateral, para as seções do app que não cabem nas abas. Adicione-o ao Scaffold:

Scaffold(
  appBar: AppBar(title: Text(folder)),
  drawer: Drawer(
    child: ListView(
      children: [
        const DrawerHeader(child: Text('Mail')),
        ListTile(
          title: const Text('Sent'),
          onTap: () {
            setState(() {
              folder = 'Sent';
            });
            Navigator.pop(context);
          },
        ),
      ],
    ),
  ),
)

Com um drawer, a barra do app mostra um botão de menu com três linhas no início. Toque nele ou deslize a partir da borda para abrir o drawer.

O drawer permanece aberto até que algo o feche. Um drawer aberto é como uma tela sobre a página, então Navigator.pop(context) o fecha. Chame-o depois que uma linha for tocada, caso contrário, o drawer cobrirá a página escolhida.

Um DrawerHeader é a área grande na parte superior, destinada ao nome do app ou à conta conectada.

challenge icon

Desafio

Fácil

Abra a gaveta com o botão de menu: ela contém apenas a Inbox. Adicione mais duas linhas como a linha da Inbox, cada uma definindo folder e fechando a gaveta:

  • Sent, com Icons.send
  • Trash, com Icons.delete

Experimente você mesmo

import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      debugShowCheckedModeBanner: false,
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatefulWidget {
  const HomeScreen({super.key});

  @override
  State<HomeScreen> createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  String folder = 'Inbox';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text(folder)),
      body: Center(
        child: Text('No messages in $folder'),
      ),
      drawer: Drawer(
        child: ListView(
          children: [
            const DrawerHeader(
              child: Text('Mail', style: TextStyle(fontSize: 24)),
            ),
            ListTile(
              leading: const Icon(Icons.inbox),
              title: const Text('Inbox'),
              onTap: () {
                setState(() {
                  folder = 'Inbox';
                });
                Navigator.pop(context);
              },
            ),
          ],
        ),
      ),
    );
  }
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Listas e telas

Pratique por conta própria: Compilador de Flutter online