Context y provider para persistir hábitos en React Native
Clase 16 de 23 • Curso de Fundamentos de React Native
Contenido del curso
Módulo 2: Construcción de la Interfaz de Usuario
- 5

Uso de constantes y condicionales en archivos TSX de React Native
10:36 min - 6

Componentes reutilizables en React Native
14:50 min - 7

StyleSheet y Flexbox en React Native
11:24 min - 8

Paleta de colores con hooks en React Native
13:07 min - 9

useState para interfaces dinámicas en React Native
12:12 min - 10

Estado interactivo en React Native con useCallback
13:24 min - 11

Pressable vs TouchableOpacity en React Native
09:37 min
Módulo 3: Interactividad y Manejo de Datos
- 12

Crear un carrusel con ScrollView horizontal
10:51 min - 13

Diferencias entre ScrollView y FlatList para listas grandes
09:47 min - 14

Instalación de Async Storage para persistencia de datos en React Native
14:54 min - 15

Context y Provider para estado global de hábitos
12:08 min - 16

Context y provider para persistir hábitos en React Native
Viendo ahora - 17

React Native: Provider de animación con confetti
11:58 min - 18

Cómo crear una ExploreCard específica para iOS y Android
09:48 min - 19

Implementación del tab Explore con FlatList y carga asíncrona
12:49 min - 20

Contexto de perfil con persistencia y avatar aleatorio usando IA
12:32 min - 21

Cámara y galería en React Native
16:01 min
Módulo 4: Visualización de Listas y Contenido
Mantén tus hábitos incluso al cerrar y reabrir la app: con persistencia de datos, un context centralizado y un provider bien configurado, toda la UI en home y tabs accede a la misma fuente de verdad. La información vive en asset storage y se expone mediante un hook reusable, evitando duplicaciones y errores.
¿Cómo implementar persistencia con context y provider?
Para que los hábitos no se pierdan, se almacena el estado en asset storage y se entrega mediante un provider. Se retorna un ReactNode envolviendo a los children y se expone un value con el estado y las acciones. Así, al salir y volver a abrir, los datos permanecen.
- Estado compartido: loading, habits y acciones como add habit y toggle habit.
- Provider: entrega value y recibe children.
- Consistencia de nombres: usa el mismo nombre del context al crear y consumir.
import React, { createContext, useContext, useState, useMemo } from 'react';
const HabitsContext = createContext(null);
export function HabitsProvider({ children }) {
const [habits, setHabits] = useState([]);
const [loading, setLoading] = useState(true);
const [timer, setTimer] = useState<number>(250); // tipado de setTimer como number
const addHabit = (id) => {
// lógica para agregar hábito y persistir en asset storage
};
const toggleHabit = (id, day) => {
// lógica para alternar completado por día y persistir
};
const value = useMemo(() => ({ loading, habits, addHabit, toggleHabit }), [loading, habits]);
return (
<HabitsContext.Provider value={value}>
{children}
</HabitsContext.Provider>
);
}
¿Qué hook reusable garantiza seguridad al consumir el context?
Se exporta un hook sin parámetros, con verificación estricta: si no existe context, se hace throw con un mensaje claro. Asegúrate de retornar el ctx completo para acceder a todo.
export function useHabits() {
const ctx = useContext(HabitsContext);
if (!ctx) throw new Error('useHabits debe usarse dentro de HabitsProvider');
return ctx; // retorna todo el contexto
}
¿Cómo integrar el provider en la navegación y en home?
El provider debe envolver el árbol completo donde vive la UI (por ejemplo, las tabs), igual que se hace con el theme. Así, cualquier pantalla puede leer y actualizar hábitos desde el context.
export default function App() {
return (
<HabitsProvider>
<Tabs />
</HabitsProvider>
);
}
- Importa desde el context: trae loading, habits y add habit con useHabits.
- Migra lógica local: reemplaza manejadores locales por funciones del context.
- Render: usa habits en lugar de items y elimina el key extractor externo si ya hay llaves.
¿Cómo definir onAdd con useCallback y validar entrada?
La adición de hábitos sale de la pantalla y se delega al context. Se valida el título y se limpia el estado local después.
import { useCallback, useState } from 'react';
import { useHabits } from './habits-context';
function Home() {
const { addHabit } = useHabits();
const [title, setTitle] = useState('');
const onAdd = useCallback(() => {
const id = title; // identificador por título
if (!title) return; // validación
addHabit(id);
setTitle(''); // limpiar estado local
}, [title, addHabit]);
// ...
}
¿Cómo alternar el completado diario y mostrar loading?
Usa la función del context para alternar sin gestionar estado duplicado en home. Muestra un texto si loading es verdadero.
function Home() {
const { loading, habits, toggleHabit } = useHabits();
const today = new Date();
const esMismoDia = (a, b) => a.toDateString() === b.toDateString();
if (loading) return <Text>Cargando…</Text>;
const renderItem = ({ item }) => (
<HabitCard
habit={item}
onToggle={() => toggleHabit(item.id, today)} // alterna completado hoy
/>
);
return (
<FlatList
data={habits}
renderItem={renderItem}
// sin key extractor externo si ya hay llaves
/>
);
}
¿Qué ajustes garantizan consistencia y limpieza del estado?
Con la lógica centralizada, se simplifica la UI y se evitan errores comunes.
- Filtrado de completados por día: usa habits y verifica el día actual antes de contar rachas.
- Nombres consistentes: asegúrate de usar el mismo nombre del context al crearlo y al consumirlo.
- Retorno de contexto: en useHabits, retorna el ctx completo para exponer todo.
- Botón de limpieza: agrega un botón que haga un “clear” del assing storage para reiniciar hábitos.
// Ejemplo de botón para limpiar almacenamiento
<Button
title="Limpiar"
onPress={async () => {
// hacer un clear del assing storage y recargar si es necesario
}}
/>
Además, al recargar desde Expo Go verás que las tarjetas reaparecen según lo guardado; si limpias y recargas, vuelves a cero. Con estas bases ya puedes persistir hábitos, marcarlos como completados y mantener rachas sin perder datos.
¿Te gustaría conectar las sugerencias del Explorer para añadir directamente a la pantalla principal? Cuéntalo en comentarios y comparte qué más te gustaría automatizar.