Inicio » Cursos » App restaurant con pedidos en Flutter

Curso App restaurant con pedidos en Flutter

Capitulo 6 ➜ Implementación de Provider

Implementación de Provider en el Carrito de Compras

En esta lección, aprenderás a implementar el patrón Provider en Flutter para gestionar el estado del carrito de compras en tu aplicación de restaurante. Utilizaremos el modelo Cart para almacenar y manipular los items seleccionados por el usuario, facilitando la notificación de cambios

Provider es un paquete que ayuda a gestionar el estado en aplicaciones Flutter. Facilita la inyección de dependencias y la comunicación entre widgets sin necesidad de pasar datos manualmente por todo el árbol de widgets. Con Provider, los widgets pueden reaccionar automáticamente a los cambios en los datos.

Implementación del CartProvider

A continuación, se presenta el código del CartProvider, que se encargará de manejar la lógica del carrito:

import 'package:flutter/material.dart';
import 'package:restaurant/models/cart.dart';

class CartProvider with ChangeNotifier {
  List<Cart> _items = [];

  List<Cart> get items => _items;

  void addItem(Cart item) {
    // Verifica si el artículo ya está en el carrito
    final index = _items.indexWhere((cart) => cart.id == item.id);
    if (index >= 0) {
      // Si ya existe, solo actualiza la cantidad
      _items[index].quantity++;
    } else {
      // Si no existe, añade el artículo al carrito
      _items.add(item);
    }
    notifyListeners(); // Notifica a los oyentes
  }

  void removeItem(Cart item) {
    _items.remove(item);
    notifyListeners(); // Notifica a los oyentes
  }

  void increaseQuantity(Cart item) {
    final index = _items.indexWhere((cart) => cart.id == item.id);
    if (index >= 0) {
      _items[index].quantity++;
      notifyListeners(); // Notifica a los oyentes
    }
  }

  void decreaseQuantity(Cart item) {
    final index = _items.indexWhere((cart) => cart.id == item.id);
    if (index >= 0) {
      // Disminuye la cantidad
      _items[index].quantity--;

      // Si la cantidad llega a cero, elimina el artículo del carrito
      if (_items[index].quantity <= 0) {
        removeItem(_items[index]); // Llama al método removeItem
      } else {
        notifyListeners(); // Notifica a los oyentes si solo se ha reducido la cantidad
      }
    }
  }

  int get totalItems {
    return _items.fold(0, (sum, item) => sum + item.quantity);
  }

  // Calcula el subtotal general del carrito
  double get subtotal {
    return _items.fold(0.0, (sum, item) => sum + item.subtotal);
  }

  // Calcula el TAX (18%) sobre el subtotal
  double get tax {
    return subtotal * 0.18;
  }

  // Calcula el total general (subtotal + tax)
  double get total {
    return subtotal + tax;
  }

  // Limpia el carrito
  void clearCart() {
    _items.clear();
    notifyListeners(); // Notifica a los oyentes
  }
}

Explicación del Código

Propiedades:

  • _items: Una lista privada que almacena los items en el carrito.
  • items: Getter para acceder a la lista de items desde otros widgets.

Métodos:

 

  • addItem(Cart item):

    • Descripción: Este método agrega un nuevo item al carrito.
    • Código:
      dart
      
      final index = _items.indexWhere((cart) => cart.id == item.id);
      if (index >= 0) {
        // Si ya existe, solo actualiza la cantidad
        _items[index].quantity++;
      } else {
        // Si no existe, añade el artículo al carrito
        _items.add(item);
      }
      notifyListeners(); // Notifica a los oyentes
    • Funcionamiento: Busca si el item ya existe en el carrito. Si existe, incrementa su cantidad. Si no existe, lo añade a la lista. Luego, llama a notifyListeners() para notificar a los widgets que dependen de este estado.
  • removeItem(Cart item):

    • Descripción: Elimina un item específico del carrito.
    • Código:
      dart
      
      _items.remove(item);
      notifyListeners(); // Notifica a los oyentes
    • Funcionamiento: Elimina el item pasado como argumento de la lista _items y notifica a los oyentes sobre el cambio.
  • increaseQuantity(Cart item):

    • Descripción: Aumenta la cantidad de un item específico en el carrito.
    • Código:
      dart
      
      final index = _items.indexWhere((cart) => cart.id == item.id);
      if (index >= 0) {
        _items[index].quantity++;
        notifyListeners(); // Notifica a los oyentes
      }
    • Funcionamiento: Busca el index del item y, si existe, incrementa su cantidad y notifica a los oyentes.
  • decreaseQuantity(Cart item):

    • Descripción: Disminuye la cantidad de un item en el carrito, eliminándolo si llega a cero.
    • Código:
      dart
      
      final index = _items.indexWhere((cart) => cart.id == item.id);
      if (index >= 0) {
        // Disminuye la cantidad
        _items[index].quantity--;
      
        // Si la cantidad llega a cero, elimina el artículo del carrito
        if (_items[index].quantity <= 0) {
          removeItem(_items[index]); // Llama al método removeItem
        } else {
          notifyListeners(); // Notifica a los oyentes si solo se ha reducido la cantidad
        }
      }
      
    • Funcionamiento: Busca el item en la lista y disminuye su cantidad. Si la cantidad se reduce a cero, se elimina del carrito y se notifica a los oyentes si la cantidad solo se ha reducido.
  • totalItems:

    • Descripción: Devuelve el total de items en el carrito.
    • Código:
      dart
      
      return _items.fold(0, (sum, item) => sum + item.quantity);
    • Funcionamiento: Utiliza fold para sumar las cantidades de todos los items en el carrito y devolver el total.

  • subtotal:

    • Descripción: Calcula el subtotal del carrito.
    • Código:
      dart
      
      return _items.fold(0.0, (sum, item) => sum + item.subtotal);
    • Funcionamiento: Suma el subtotal de cada item en la lista _items.
  • tax:

    • Descripción: Calcula el impuesto (18%) sobre el subtotal.
    • Código:
      dart
      
      return subtotal * 0.18; // Cambiado de igv a tax
    • Funcionamiento: Multiplica el subtotal por 0.18 para calcular el impuesto.
  • total:

    • Descripción: Calcula el total del carrito incluyendo el subtotal y el impuesto.
    • Código:

      dart

      return subtotal + tax; // Cambiado de igv a tax
    • Funcionamiento: Suma el subtotal y el impuesto para devolver el total.
  • clearCart():

    • Descripción: Limpia todos los items del carrito.
    • Código:
      dart
      
      _items.clear();
      notifyListeners(); // Notifica a los oyentes
    • Funcionamiento: Elimina todos los items de la lista _items y notifica a los oyentes sobre el cambio.

En esta lección, has aprendido a implementar el patrón Provider para gestionar el carrito de compras en tu aplicación de restaurante. Esta estructura te permitirá manejar el estado de forma eficiente y reaccionar a los cambios en la interfaz de usuario de manera automática. En la próxima lección, exploraremos cómo conectar este carrito con la interfaz para permitir que los usuarios interactúen con él.


2004 visitas

Descarga el código del proyecto

Descarga el código fuente del proyecto adquiriendo el curso completo

Comprar

Más cursos que pueden interesarte

Más cursos

Codea Applications

México, Colombia, España, Venezuela, Argentina, Bolivia, Perú

© Copyright Codea::App Cursos de Programación Online | LATAM | 2020 - 2024