Saltar al contenido

Lección 9 de 20 · Lectura y práctica

Práctica: Crea una app de lista de tareas con navegación y estado

Tipo de lección: VideoConcepto claveEn el desarrollo de aplicaciones móviles con React Native, dos pilares fundamentales son la navegación y la gestión de estado. Imagina que tu aplicación es una ciudad: la navegación son las.

Del concepto a la práctica

Taller de esta lección

Una lista de tareas permite probar simultáneamente identidad, navegación y actualización. Usa tareas de mantenimiento de una tienda: { id: 't1', title: 'Revisar stock', done: false }. La pantalla de detalle debe recibir el ID, no el índice, porque el orden puede cambiar.

Ejemplo resuelto

  1. Guarda tres tareas en un contexto compartido.

  2. Muestra solo title y una marca textual para done.

  3. Navega al detalle con taskId y alterna la tarea mediante una acción del contexto.

  4. Regresa al listado y observa el cambio. Un error frecuente es usar el índice como clave y como identidad. Corrígelo con el campo id; así completar la segunda tarea no afecta a otra si filtras la lista.

Pruébalo

Carga t1, t2 y t3, completa t2 y filtra después las tareas pendientes.

Comprueba tu resultado

El listado pendiente debe contener exactamente t1 y t3; en la vista de todas las tareas, t2 conserva done: true y la navegación no duplica registros.

Tres tareas y dos vistas distintas

Inicializa [{id:'t1',title:'Revisar stock',done:false},{id:'t2',title:'Ordenar agenda',done:false},{id:'t3',title:'Cerrar caja',done:false}]. Completar t2 crea un array nuevo con map y copia solo esa tarea. La vista de pendientes contiene t1,t3; la vista de todas contiene tres registros y t2=true. La comprobación del borrador se refiere a estas dos vistas, no a que un filtro de pendientes muestre t2.

Detalle recibe taskId, busca la tarea vigente y contempla t9 o una tarea eliminada mientras el detalle está abierto. Un ID no conocido produce Tarea no encontrada. No uses el índice como key ni transportes un callback en los parámetros. Reordenar por título con una copia no altera qué tarea está marcada. IDs de fixtures son constantes; Date.now no garantiza unicidad si creas múltiples tareas en el mismo instante, así que utiliza una estrategia apropiada en el proyecto.

La edición exige trim no vacío y conserva ID. Context sobre navegación mantiene estado entre estas pantallas; no significa que sobreviva al reinicio. Si añades persistencia, muestra estado de hidratación y no guardes el array vacío antes de cargar lo almacenado. Prueba completar, filtrar, volver a todos y consultar t9 como cuatro acciones independientes.

Diagrama de decisión con ramas Sí y No y un bucle que procesa cada elemento de una lista.
CursaloMapa de práctica
Cómo avanza un programa

Una condición decide qué camino ejecuta el programa. Un bucle repite una operación mientras queden elementos, y termina cuando la lista se agota. Separar ambas ideas ayuda a seguir el flujo y comprobar casos límite.

Ver la infografía en tamaño completo ↗

Tipo de lección: Video

Concepto clave

En el desarrollo de aplicaciones móviles con React Native, dos pilares fundamentales son la navegación y la gestión de estado. Imagina que tu aplicación es una ciudad: la navegación son las calles que conectan diferentes barrios (pantallas), mientras que el estado es la memoria colectiva de la ciudad que recuerda qué está pasando en cada lugar.

Para aplicaciones de lista de tareas, necesitas que los usuarios puedan moverse entre pantallas (como la lista principal y la pantalla de detalles) mientras mantienes un registro consistente de qué tareas existen, cuáles están completadas y cuáles pendientes. Esto requiere una arquitectura donde el estado sea accesible desde cualquier pantalla sin pasar datos manualmente entre componentes.

Cómo funciona en la práctica

Vamos a construir una aplicación de tareas con tres pantallas principales: una pantalla de lista, una pantalla de detalles y una pantalla para agregar nuevas tareas. Usaremos React Navigation para manejar la navegación entre ellas y Context API junto con useReducer para gestionar el estado global de las tareas.

Paso 1: Configuraremos un stack navigator con tres pantallas. Paso 2: Crearemos un contexto que almacene el estado de las tareas y funciones para agregar, eliminar y marcar como completadas. Paso 3: Conectaremos cada pantalla al contexto para leer y modificar el estado. El flujo será: el usuario ve la lista, toca una tarea para ver detalles, y desde allí puede marcarla como completada o eliminarla.

Codigo en accion

Primero, veamos cómo configurar el contexto del estado:

// TaskContext.js
import React, { createContext, useReducer, useContext } from 'react';

const TaskContext = createContext();

const initialState = {
  tasks: [
    { id: '1', title: 'Aprender React Native', completed: false },
    { id: '2', title: 'Configurar Expo', completed: true }
  ]
};

function taskReducer(state, action) {
  switch (action.type) {
    case 'ADD_TASK':
      return { ...state, tasks: [...state.tasks, action.payload] };
    case 'TOGGLE_TASK':
      return {
        ...state,
        tasks: state.tasks.map(task =>
          task.id === action.payload ? { ...task, completed: !task.completed } : task
        )
      };
    case 'DELETE_TASK':
      return {
        ...state,
        tasks: state.tasks.filter(task => task.id !== action.payload)
      };
    default:
      return state;
  }
}

export function TaskProvider({ children }) {
  const [state, dispatch] = useReducer(taskReducer, initialState);
  return (
    
      {children}
    
  );
}

export function useTasks() {
  return useContext(TaskContext);
}

Ahora, aquí está cómo integrar la navegación con este estado en una pantalla de lista:

// TaskListScreen.js
import React from 'react';
import { View, FlatList, TouchableOpacity, Text } from 'react-native';
import { useTasks } from './TaskContext';

function TaskListScreen({ navigation }) {
  const { state, dispatch } = useTasks();

  const renderItem = ({ item }) => (
     navigation.navigate('TaskDetail', { taskId: item.id })}
    >
      {item.title} - {item.completed ? 'Completada' : 'Pendiente'}
    
  );

  return (
    
       item.id}
      />
       navigation.navigate('AddTask')}>
        Agregar Nueva Tarea
      
    
  );
}

export default TaskListScreen;

Errores comunes

  • No envolver la app con el proveedor de contexto: Si olvidas envolver tu componente principal con TaskProvider, el contexto no estará disponible en las pantallas. Solución: Asegúrate de que App.js incluya alrededor del Navigator.
  • Mutación directa del estado: Modificar el array de tareas directamente (ej., state.tasks.push()) causa errores. Siempre usa dispatch con acciones inmutables, como se muestra en el reducer.
  • Navegación sin parámetros necesarios: Al navegar a TaskDetail, si no pasas taskId, la pantalla no sabrá qué tarea mostrar. Verifica que los parámetros estén definidos en navigation.navigate().
  • Olvidar manejar el estado de carga: En apps reales, el estado podría cargarse de forma asíncrona. Agrega un estado de loading en el contexto para evitar errores en pantallas vacías.

Checklist de dominio

  1. Configuré un stack navigator con al menos tres pantallas usando React Navigation.
  2. Implementé un contexto con useReducer para gestionar tareas (agregar, eliminar, toggle).
  3. Conecté todas las pantallas al contexto para leer y modificar el estado.
  4. Probé la navegación entre pantallas pasando parámetros cuando es necesario.
  5. Manejé errores comunes como mutación de estado y parámetros faltantes.
  6. Agregué funcionalidad para persistir tareas (ej., usando AsyncStorage) opcionalmente.
  7. Probé la app en ambos iOS y Android para verificar consistencia.

Crea una app de lista de tareas con navegación y estado global

Sigue estos pasos para construir una aplicación funcional de lista de tareas que integre navegación y gestión de estado:

  1. Configura el proyecto: Crea un nuevo proyecto Expo con npx create-expo-app TaskApp e instala React Navigation y las dependencias necesarias (@react-navigation/native, @react-navigation/stack).
  2. Implementa el contexto de estado: Crea un archivo TaskContext.js similar al ejemplo, con un reducer que maneje ADD_TASK, TOGGLE_TASK y DELETE_TASK. Usa un estado inicial con al menos dos tareas de ejemplo.
  3. Configura la navegación: En App.js, configura un Stack Navigator con tres pantallas: TaskListScreen, TaskDetailScreen y AddTaskScreen. Envuelve el Navigator con TaskProvider.
  4. Desarrolla las pantallas:
    • TaskListScreen: Muestra una lista de tareas usando FlatList, cada elemento debe navegar a TaskDetailScreen al tocar.
    • TaskDetailScreen: Muestra los detalles de una tarea (título, estado) y botones para marcar como completada o eliminar, usando dispatch del contexto.
    • AddTaskScreen: Incluye un formulario simple (TextInput y botón) para agregar nuevas tareas al contexto.
  5. Conecta el estado: En cada pantalla, usa el hook useTasks para acceder al estado y dispatch. Asegúrate de que los cambios se reflejen en todas las pantallas.
  6. Prueba la app: Ejecuta la app con npx expo start y prueba en un emulador o dispositivo real. Verifica que la navegación funcione y el estado se mantenga consistente.
Pistas
  • Usa useNavigation de React Navigation para acceder a la navegación en componentes que no son pantallas, si es necesario.
  • Para generar IDs únicos para tareas, considera usar Date.now().toString() o una librería como uuid.
  • Si encuentras errores de rendimiento con FlatList, implementa useMemo o useCallback para optimizar.

Evalua tu comprension

Completa el quiz interactivo de arriba para ganar XP.

Sigue con React Native con Expo: Desarrollo de Apps Nativas para iOS y Android

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.

01 / ELEGIR UNA RUTA

El próximo paso

Aprende IA mientras construyes algo que sí necesitas.

Empieza por el curso inicial o explora el catálogo para encontrar una práctica alineada con tu trabajo.