Manejando Estados con Flutter utilizando Provider

Aprende cómo gestionar el estado de tus aplicaciones Flutter de forma eficiente y escalable usando el paquete Provider. Incluye ejemplos prácticos y buenas prácticas.

Alberto-Guaman
2025-01-13
12 min
Flutter Provider Estado Desarrollo Móvil
Compartir:
Manejando Estados con Flutter utilizando Provider

¿Quieres construir apps Flutter reactivas y escalables?
¡Provider es la solución recomendada para manejar el estado de forma sencilla y eficiente!


¿Qué es Provider?

Provider es un paquete oficial de Flutter para la gestión de estado. Permite compartir datos y lógica entre widgets de manera reactiva, eficiente y desacoplada.

  • Sencillo: Fácil de aprender y usar.
  • Escalable: Ideal para proyectos pequeños y grandes.
  • Recomendado: Es la solución sugerida por el equipo de Flutter.

¿Por qué necesitas manejar el estado?

En Flutter, el “estado” es cualquier dato que puede cambiar durante la vida de la app (ej: usuario logueado, contador, lista de tareas, etc). Manejarlo bien es clave para apps robustas y mantenibles.


Instalación de Provider

Agrega Provider a tu archivo pubspec.yaml:

dependencies:
  flutter:
    sdk: flutter
  provider: ^6.0.0

Luego ejecuta:

flutter pub get

Ejemplo básico: Contador con Provider

1. Crea una clase de estado

import 'package:flutter/material.dart';

class ContadorModel with ChangeNotifier {
  int _valor = 0;

  int get valor => _valor;

  void incrementar() {
    _valor++;
    notifyListeners();
  }
}

2. Provee el estado en el árbol de widgets

import 'package:provider/provider.dart';

void main() {
  runApp(
    ChangeNotifierProvider(
      create: (_) => ContadorModel(),
      child: MyApp(),
    ),
  );
}

3. Consume el estado en tus widgets

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Contador con Provider')),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text('Valor actual:'),
              Consumer<ContadorModel>(
                builder: (context, contador, child) =>
                  Text(
                    '${contador.valor}',
                    style: TextStyle(fontSize: 40, fontWeight: FontWeight.bold),
                  ),
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: () => context.read<ContadorModel>().incrementar(),
                child: Text('Incrementar'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

¿Cómo funciona Provider?

  • ChangeNotifier: Clase base que notifica a los widgets cuando hay cambios.
  • ChangeNotifierProvider: Provee una instancia de tu modelo a los widgets hijos.
  • Consumer: Widget que escucha los cambios y reconstruye solo lo necesario.
  • context.read() / context.watch(): Acceso directo al modelo desde el contexto.

Buenas prácticas con Provider

  • Mantén la lógica de negocio fuera de los widgets.
  • Usa varios providers para separar responsabilidades (ej: AuthProvider, CartProvider, etc).
  • Evita anidar demasiados providers, usa MultiProvider si es necesario.
  • Usa notifyListeners() solo cuando realmente cambie el estado.

Ejemplo avanzado: Lista de tareas (To-Do)

1. Modelo de tarea y provider

class Tarea {
  final String titulo;
  bool completada;

  Tarea(this.titulo, {this.completada = false});
}

class TareasProvider with ChangeNotifier {
  List<Tarea> _tareas = [];

  List<Tarea> get tareas => _tareas;

  void agregarTarea(String titulo) {
    _tareas.add(Tarea(titulo));
    notifyListeners();
  }

  void toggleTarea(int index) {
    _tareas[index].completada = !_tareas[index].completada;
    notifyListeners();
  }
}

2. Proveer y consumir el estado

void main() {
  runApp(
    ChangeNotifierProvider(
      create: (_) => TareasProvider(),
      child: MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: TareasScreen(),
    );
  }
}

class TareasScreen extends StatelessWidget {
  final TextEditingController _controller = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Lista de Tareas')),
      body: Column(
        children: [
          Padding(
            padding: const EdgeInsets.all(16.0),
            child: Row(
              children: [
                Expanded(
                  child: TextField(
                    controller: _controller,
                    decoration: InputDecoration(hintText: 'Nueva tarea'),
                  ),
                ),
                IconButton(
                  icon: Icon(Icons.add),
                  onPressed: () {
                    if (_controller.text.isNotEmpty) {
                      context.read<TareasProvider>().agregarTarea(_controller.text);
                      _controller.clear();
                    }
                  },
                )
              ],
            ),
          ),
          Expanded(
            child: Consumer<TareasProvider>(
              builder: (context, tareasProvider, child) => ListView.builder(
                itemCount: tareasProvider.tareas.length,
                itemBuilder: (context, index) {
                  final tarea = tareasProvider.tareas[index];
                  return ListTile(
                    title: Text(
                      tarea.titulo,
                      style: TextStyle(
                        decoration: tarea.completada ? TextDecoration.lineThrough : null,
                      ),
                    ),
                    trailing: Checkbox(
                      value: tarea.completada,
                      onChanged: (_) => context.read<TareasProvider>().toggleTarea(index),
                    ),
                  );
                },
              ),
            ),
          ),
        ],
      ),
    );
  }
}

Recursos útiles


¿Listo para crear apps Flutter reactivas y escalables?
¡Con Provider, manejar el estado es más fácil que nunca!

Qué dicen nuestros clientes

Nos enorgullecemos de colaborar con empresas visionarias que buscan soluciones tecnológicas innovadoras y personalizadas.

EXCELENTEA base de 9 reseñas

Excelente profesional, rápido y amable en todo el proceso de lo que necesitas crear.

RM
Raúl Muñoz Jara
2024-08-13

Tinguar es una empresa de diseño web de primer nivel que superó todas mis expectativas. La calidad de su trabajo es impecable.

BL
Bryan German Leon Rueda
2024-02-22

Excelente servicio, me ayudo con mi pagina EEUU. Lo recomiendo 100%.

JL
Jorge Luis
2024-04-26

Excelente servicio, me realizo la pagina web y va de maravilla. Recomendable.

DJ
Daniel Jaramillo
2024-03-04

Excelente servicio y atención, recomendado llevo años con esta empresa y son muy profesionales.

AV
Adrian Alejandro Villena
2023-06-06

El gerente excelente profesional, realizó nuestra página para el centro pre universitario.. 10 / 10

CL
Carranza Luis
2023-09-02

Increíble trabajo, muy profesional y puntual. Mi sitio web quedó perfecto.

MG
María González
2024-01-15

Excelente atención al cliente y resultados sobresalientes. Altamente recomendado.

CR
Carlos Rodríguez
2024-05-20

Trabajo de calidad superior, entregaron antes de lo esperado. Muy satisfecho.

AM
Ana Martínez
2024-03-18

Profesionales de primera, entendieron perfectamente lo que necesitaba.

LF
Luis Fernández
2024-06-10

Servicio excepcional, comunicación clara y resultados excelentes.

PS
Patricia Silva
2024-04-05

Equipo muy competente, transformaron mi idea en una realidad digital increíble.

RT
Roberto Torres
2024-07-22

Excelente profesional, rápido y amable en todo el proceso de lo que necesitas crear.

RM
Raúl Muñoz Jara
2024-08-13

Tinguar es una empresa de diseño web de primer nivel que superó todas mis expectativas. La calidad de su trabajo es impecable.

BL
Bryan German Leon Rueda
2024-02-22

Excelente servicio, me ayudo con mi pagina EEUU. Lo recomiendo 100%.

JL
Jorge Luis
2024-04-26

Excelente servicio, me realizo la pagina web y va de maravilla. Recomendable.

DJ
Daniel Jaramillo
2024-03-04

Excelente servicio y atención, recomendado llevo años con esta empresa y son muy profesionales.

AV
Adrian Alejandro Villena
2023-06-06

El gerente excelente profesional, realizó nuestra página para el centro pre universitario.. 10 / 10

CL
Carranza Luis
2023-09-02

Increíble trabajo, muy profesional y puntual. Mi sitio web quedó perfecto.

MG
María González
2024-01-15

Excelente atención al cliente y resultados sobresalientes. Altamente recomendado.

CR
Carlos Rodríguez
2024-05-20

Trabajo de calidad superior, entregaron antes de lo esperado. Muy satisfecho.

AM
Ana Martínez
2024-03-18

Profesionales de primera, entendieron perfectamente lo que necesitaba.

LF
Luis Fernández
2024-06-10

Servicio excepcional, comunicación clara y resultados excelentes.

PS
Patricia Silva
2024-04-05

Equipo muy competente, transformaron mi idea en una realidad digital increíble.

RT
Roberto Torres
2024-07-22
Verificado por Trustindex

¿Te gustó este artículo?

Si encontraste útil este contenido, considera compartirlo o contactarnos para proyectos similares. Estamos aquí para ayudarte con tus necesidades tecnológicas.

¡Comunicate por WhatsApp !