Menu
CoddyTech

Pestañas con una barra de navegación

Parte de la sección Listas y pantallas del Journey de Flutter de Coddy. Lección 23 de 33.

Muchas aplicaciones organizan sus páginas principales en pestañas a lo largo de la parte inferior de la pantalla. NavigationBar las dibuja; se lo pasas a Scaffold en bottomNavigationBar:.

NavigationBar(
  selectedIndex: index,
  onDestinationSelected: (int i) {
    setState(() {
      index = i;
    });
  },
  destinations: const [
    NavigationDestination(icon: Icon(Icons.home), label: 'Home'),
    NavigationDestination(icon: Icon(Icons.settings), label: 'Settings'),
  ],
)

Cada NavigationDestination es una pestaña, con un icono y una etiqueta. selectedIndex indica qué pestaña está resaltada, empezando a contar desde 0. Cuando se toca una pestaña, onDestinationSelected recibe su índice.

La barra no recuerda la pestaña por sí sola: guardas index en tu estado y lo cambias con setState. El cuerpo muestra la página correspondiente a ese índice, aquí pages[index], de una lista de widgets.

challenge icon

Desafío

Fácil

La barra tiene tres pestañas, pero al tocarlas no ocurre nada. Agrega onDestinationSelected: para que se resalte la pestaña tocada y se muestre su página: Favorites page para Favorites, Settings page para Settings.

Pruébalo tú mismo

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> {
  int index = 0;
  final List<Widget> pages = const [
    Center(child: Text('Home page')),
    Center(child: Text('Favorites page')),
    Center(child: Text('Settings page')),
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('My App')),
      body: pages[index],
      bottomNavigationBar: NavigationBar(
        selectedIndex: index,
        destinations: const [
          NavigationDestination(icon: Icon(Icons.home), label: 'Home'),
          NavigationDestination(icon: Icon(Icons.favorite), label: 'Favorites'),
          NavigationDestination(icon: Icon(Icons.settings), label: 'Settings'),
        ],
      ),
    );
  }
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Listas y pantallas

Practica por tu cuenta: Compilador de Flutter online