Lección 19 de 20 · Lectura y práctica
Práctica: Desarrollar y probar la app completa
Concepto claveDesarrollar una app completa de comercio electrónico con React Native y Expo implica integrar múltiples componentes que funcionen como un sistema unificado. Piensa en esto como construir una tienda física: necesitas.
Del concepto a la práctica
Taller de esta lección
Una prueba integrada debe seguir una historia completa y verificar puntos intermedios. Usa datos pequeños para poder recalcular. En la tienda, selecciona un producto, cambia cantidad, navega al checkout, provoca un error de validación y después completa el pago simulado. Comprueba que cada pantalla lee el mismo estado.
Ejemplo resuelto
Con cuaderno 4,00 × 2 y envío 2,00, el checkout muestra subtotal 8,00 y total 10,00. Si el correo está vacío, no llama al pago. Tras corregirlo, el simulador aprobado crea un pedido y vacía el carrito solo después del éxito.
Pruébalo
Registra estado inicial.
Ejecuta el flujo con una entrada inválida.
Corrige sin perder la línea.
Ejecuta aprobación y verifica limpieza final.
Error frecuente: vaciar el carrito al pulsar pagar antes de conocer la respuesta. Corrige esperando el resultado aprobado.
Ejercicio: repite con pago rechazado.
Comprueba tu resultado
el carrito conserva dos cuadernos, el total sigue siendo 10,00 y el usuario puede reintentar.
Integración con datos y fallos comunes
Para el recorrido nuevo usa o18 y una sola línea [{id:'p1',qty:2}]. El catálogo de17 produce800+200=1000 céntimos. checkoutPrueba de18 acepta esa línea y calcula1000, no el fixture anterior1450. Al iniciar, hidrata cart:v1 con leerCarrito y valida stock/precio actual; no guardes [] antes de acabar lectura. Si cargas productos.json empaquetado, impórtalo como recurso local compatible, no asumas que fetch('/products.json') sirve en teléfono.
Prueba nombre válido/email ana@/postal02001: no crea pedido y conserva qty2. Luego datos Ana/ana@example.com/02001: rechazo conserva qty2 y total1000; red fallida también; aprobación simulada confirma o18/1000 y permite vaciar. Reinicia el fixture para cada rama y registra cantidades, estado y mensaje. Una pantalla abierta no añade otra unidad. Estado ausente, archivo corrupto y producto desconocido tienen caminos visibles y no un precio de0 inventado.
Para pagos reales el servidor valida autenticación, importe y confirmación antes de cumplimiento, sin confiar en el total del móvil. Persistencia, cámara y notificaciones requieren comprobación en dispositivo; estos fixtures de funciones no prueban esos componentes. Marca ese recorrido como pendiente si no se ejecutó.

Mapa de prácticaComprueba flujos en un dispositivo real y registra resultados observables: navegación, permisos denegados, errores y recuperación. Una prueba en Expo Go no equivale por sí sola a validar un binario distribuible o aprobar una tienda.
Ver la infografía en tamaño completo ↗Concepto clave
Desarrollar una app completa de comercio electrónico con React Native y Expo implica integrar múltiples componentes que funcionen como un sistema unificado. Piensa en esto como construir una tienda física: necesitas un mostrador de productos (catálogo), una caja registradora (carrito y checkout), y personal de atención (gestión de pedidos y usuarios). La clave está en que todos estos elementos se comuniquen entre sí de manera fluida, manteniendo el estado consistente a través de la navegación y las interacciones del usuario.
En el contexto técnico, esto significa dominar el manejo de estado global (con herramientas como Context API o Redux), la navegación entre pantallas (usando React Navigation), y la integración con APIs externas para datos en tiempo real. Un error común es tratar cada pantalla como un silo independiente; en realidad, deben ser partes de un flujo coherente donde los datos persistan y se actualicen según las acciones del usuario, similar a cómo un cliente en una tienda real puede agregar productos al carrito, ver su total, y proceder al pago sin perder información.
Cómo funciona en la práctica
Vamos a construir el flujo principal de nuestra app de comercio electrónico, desde la pantalla de productos hasta la confirmación de pedido. Primero, configuraremos la navegación con un stack para el catálogo y un tab para el carrito. Luego, implementaremos un contexto global para manejar el estado del carrito, asegurando que los productos agregados se reflejen en todas las pantallas. Finalmente, conectaremos con una API simulada para cargar productos y enviar pedidos.
Paso a paso: 1) Crea un componente CartContext que provea funciones para agregar, eliminar y calcular el total del carrito. 2) Configura React Navigation con un Stack Navigator para la pantalla de detalles del producto y un Tab Navigator para el carrito. 3) En la pantalla de productos, usa FlatList para renderizar items y botones que disparen las funciones del contexto. 4) En la pantalla de checkout, valida los datos del usuario y envía una solicitud POST a la API. Este enfoque asegura que la app sea escalable y fácil de mantener, como organizar una tienda con secciones claras y un inventario centralizado.
Codigo en accion
Aquí tienes un ejemplo funcional del contexto del carrito y cómo integrarlo en una pantalla de productos. Primero, el contexto:
// CartContext.js
import React, { createContext, useState, useContext } from 'react';
export const CartContext = createContext();
export const CartProvider = ({ children }) => {
const [cartItems, setCartItems] = useState([]);
const addToCart = (product) => {
setCartItems(prevItems => {
const existingItem = prevItems.find(item => item.id === product.id);
if (existingItem) {
return prevItems.map(item =>
item.id === product.id
? { ...item, quantity: item.quantity + 1 }
: item
);
}
return [...prevItems, { ...product, quantity: 1 }];
});
};
const removeFromCart = (productId) => {
setCartItems(prevItems => prevItems.filter(item => item.id !== productId));
};
const getTotalPrice = () => {
return cartItems.reduce((total, item) => total + (item.price * item.quantity), 0);
};
return (
{children}
);
};
export const useCart = () => useContext(CartContext);Ahora, cómo usarlo en una pantalla de productos:
// ProductScreen.js
import React from 'react';
import { View, Text, FlatList, Button } from 'react-native';
import { useCart } from './CartContext';
const ProductScreen = ({ products }) => {
const { addToCart } = useCart();
const renderItem = ({ item }) => (
{item.name}
Precio: ${item.price}
);
return (
item.id.toString()}
/>
);
};
export default ProductScreen; Errores comunes
- No manejar el estado de carga y error en las peticiones API: Esto puede causar que la app se bloquee o muestre interfaces rotas. Siempre usa estados como loading y error, y muestra indicadores o mensajes apropiados.
- Olvidar optimizar listas largas: Usar ScrollView en lugar de FlatList para listas grandes puede afectar el rendimiento. FlatList renderiza solo los items visibles, mejorando la eficiencia.
- No probar en ambos dispositivos (iOS y Android): Las diferencias en estilos y comportamientos pueden llevar a bugs. Usa Expo Go para probar en dispositivos reales o emuladores regularmente.
- Ignorar la persistencia de datos: Si el carrito se borra al recargar la app, frustra al usuario. Integra AsyncStorage o una base de datos local para guardar el estado entre sesiones.
- No validar entradas en formularios: En el checkout, falta validar emails o números de tarjeta puede causar errores en el backend. Usa librerías como Formik y Yup para validaciones robustas.
Checklist de dominio
- Configurar y usar React Navigation para manejar al menos 3 pantallas con stack y tab navigators.
- Implementar un contexto global o Redux para manejar el estado del carrito y actualizarlo en tiempo real.
- Integrar una API REST para cargar productos y enviar pedidos, manejando estados de carga y error.
- Diseñar interfaces responsivas que se vean bien en iOS y Android, usando componentes de React Native.
- Probar la app en un dispositivo físico o emulador, verificando la navegación y funcionalidades clave.
- Optimizar el rendimiento usando FlatList para listas y memoización de componentes cuando sea necesario.
- Agregar persistencia local para el carrito, de modo que los items sobrevivan a recargas de la app.
Implementar el flujo completo de compra en la app de comercio electrónico
Sigue estos pasos para construir y probar la funcionalidad principal de tu app:
- Configura la navegación: Crea un Stack Navigator con dos pantallas: ProductList y ProductDetail. Agrega un Tab Navigator que incluya las pantallas de ProductList y Cart.
- Implementa el contexto del carrito: Usa el código proporcionado en la lección para crear CartContext. Asegúrate de que las funciones addToCart, removeFromCart y getTotalPrice funcionen correctamente.
- Desarrolla la pantalla de productos: En ProductList, consume una API simulada (puedes usar json-server o datos estáticos) para mostrar una lista de productos. Cada producto debe tener un botón para agregar al carrito.
- Construye la pantalla del carrito: En Cart, muestra los items agregados, permitiendo eliminar productos y ver el total. Conecta un botón para navegar a Checkout.
- Crea la pantalla de checkout: Implementa un formulario con campos para nombre, email y dirección. Al enviar, simula una petición POST a una API y muestra un mensaje de confirmación.
- Prueba la app: Ejecuta la app en Expo Go en tu dispositivo o emulador. Verifica que puedas agregar productos, ver el carrito, y completar el checkout sin errores.
Pistas
- Usa React Navigation v6 para una configuración más sencilla; la documentación oficial tiene ejemplos de stack y tab navigators.
- Para simular la API, puedes crear un archivo products.json y usar fetch en un useEffect para cargar los datos.
- No olvides envolver tu app con CartProvider en el punto más alto (ej. App.js) para que el contexto esté disponible en todas las pantallas.
Evalua tu comprension
Completa el quiz interactivo de arriba para ganar XP.
Sigue con React Native y Expo: Interfaces, Estado y APIs de Dispositivo
Esta lección forma parte de un curso de Cursalo. Revisa su programa y elige entre la compra individual o el acceso a toda la escuela.
Si ya tenías acceso a este curso, entra con tu cuenta: tus derechos y tu progreso se conservan. No necesitas comprarlo de nuevo.