BottomNavigationBar en Flutter: ejercicio resuelto con IndexedStack

  2 minutos

Si buscas BottomNavigationBar en Flutter, este ejemplo usa IndexedStack para mantener estado en cada pestaña.

Crea tres pestañas (Inicio, Buscar, Perfil) y conserva contenido al cambiar de tab.

import 'package:flutter/material.dart';

void main() => runApp(const MaterialApp(home: TabsPage()));

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

  @override
  State<TabsPage> createState() => _TabsPageState();
}

class _TabsPageState extends State<TabsPage> {
  int index = 0;

  final pages = const [
    Center(child: Text('Inicio')),
    Center(child: Text('Buscar')),
    Center(child: Text('Perfil')),
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('BottomNavigationBar')),
      body: IndexedStack(index: index, children: pages),
      bottomNavigationBar: BottomNavigationBar(
        currentIndex: index,
        onTap: (i) => setState(() => index = i),
        items: const [
          BottomNavigationBarItem(icon: Icon(Icons.home), label: 'Inicio'),
          BottomNavigationBarItem(icon: Icon(Icons.search), label: 'Buscar'),
          BottomNavigationBarItem(icon: Icon(Icons.person), label: 'Perfil'),
        ],
      ),
    );
  }
}

El cambio de pestañas es rápido y cada tab conserva su estado.

  • Usar body = pages[index] y perder estado en tabs.
  • No sincronizar currentIndex.
  • Mezclar navegación de tabs con push/pop sin estrategia.

Se usa en apps de e-commerce, banca, medios y herramientas internas con módulos claros.

Usando IndexedStack, AutomaticKeepAliveClientMixin o soluciones de estado global.

Sí, para navegación principal en apps con 3 a 5 secciones clave.

Combinar tabs con drawer o usar navegación jerarquica por módulo.