En esta lección, aprenderemos cómo manejar errores de red en React Native. El manejo adecuado de errores es crucial para crear aplicaciones robustas y ofrecer una buena experiencia de usuario. Veremos cómo detectar y gestionar errores al realizar solicitudes HTTP utilizando fetch
y axios
.
Conceptos Clave
-
Errores de Red Comunes:
- Errores de Conexión: Ocurren cuando no se puede establecer una conexión con el servidor.
- Errores de Respuesta: Ocurren cuando el servidor responde con un código de estado HTTP que indica un error (por ejemplo, 404, 500).
- Errores de Tiempo de Espera: Ocurren cuando una solicitud tarda demasiado en completarse.
-
Manejo de Errores con
fetch
:fetch
es una API nativa de JavaScript para realizar solicitudes HTTP. No lanza errores para respuestas HTTP no exitosas (como 404 o 500), por lo que debemos manejar estos casos manualmente.
-
Manejo de Errores con
axios
:axios
es una biblioteca popular para realizar solicitudes HTTP. A diferencia defetch
,axios
lanza errores para respuestas HTTP no exitosas, lo que facilita el manejo de errores.
Ejemplo Práctico con fetch
Código de Ejemplo
import React, { useState, useEffect } from 'react'; import { View, Text, Button, ActivityIndicator } from 'react-native'; const FetchExample = () => { const [data, setData] = useState(null); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const fetchData = async () => { setLoading(true); setError(null); try { const response = await fetch('https://api.example.com/data'); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const result = await response.json(); setData(result); } catch (err) { setError(err.message); } finally { setLoading(false); } }; useEffect(() => { fetchData(); }, []); if (loading) { return <ActivityIndicator size="large" color="#0000ff" />; } if (error) { return ( <View> <Text>Error: {error}</Text> <Button title="Retry" onPress={fetchData} /> </View> ); } return ( <View> <Text>Data: {JSON.stringify(data)}</Text> </View> ); }; export default FetchExample;
Explicación
-
Estado Inicial:
data
: Almacena los datos obtenidos de la API.loading
: Indica si la solicitud está en curso.error
: Almacena cualquier error que ocurra durante la solicitud.
-
Función
fetchData
:- Establece
loading
entrue
yerror
ennull
al inicio. - Realiza la solicitud
fetch
y verifica si la respuesta es exitosa. - Si la respuesta no es exitosa, lanza un error con el código de estado HTTP.
- Si la solicitud es exitosa, convierte la respuesta a JSON y actualiza el estado
data
. - En caso de error, actualiza el estado
error
con el mensaje de error. - Finalmente, establece
loading
enfalse
.
- Establece
-
Renderizado Condicional:
- Muestra un indicador de carga mientras
loading
estrue
. - Muestra un mensaje de error y un botón de reintento si
error
no esnull
. - Muestra los datos obtenidos si
data
no esnull
.
- Muestra un indicador de carga mientras
Ejemplo Práctico con axios
Código de Ejemplo
import React, { useState, useEffect } from 'react'; import { View, Text, Button, ActivityIndicator } from 'react-native'; import axios from 'axios'; const AxiosExample = () => { const [data, setData] = useState(null); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const fetchData = async () => { setLoading(true); setError(null); try { const response = await axios.get('https://api.example.com/data'); setData(response.data); } catch (err) { setError(err.message); } finally { setLoading(false); } }; useEffect(() => { fetchData(); }, []); if (loading) { return <ActivityIndicator size="large" color="#0000ff" />; } if (error) { return ( <View> <Text>Error: {error}</Text> <Button title="Retry" onPress={fetchData} /> </View> ); } return ( <View> <Text>Data: {JSON.stringify(data)}</Text> </View> ); }; export default AxiosExample;
Explicación
-
Estado Inicial:
- Similar al ejemplo con
fetch
.
- Similar al ejemplo con
-
Función
fetchData
:- Similar al ejemplo con
fetch
, pero utilizaaxios
para realizar la solicitud. axios
lanza un error automáticamente si la respuesta HTTP no es exitosa, lo que simplifica el manejo de errores.
- Similar al ejemplo con
-
Renderizado Condicional:
- Similar al ejemplo con
fetch
.
- Similar al ejemplo con
Ejercicio Práctico
Ejercicio
- Crea una nueva pantalla en tu aplicación React Native.
- Utiliza
fetch
oaxios
para realizar una solicitud a una API pública de tu elección. - Implementa el manejo de errores para mostrar un mensaje de error y un botón de reintento si la solicitud falla.
- Muestra un indicador de carga mientras la solicitud está en curso.
- Muestra los datos obtenidos de la API si la solicitud es exitosa.
Solución
import React, { useState, useEffect } from 'react'; import { View, Text, Button, ActivityIndicator } from 'react-native'; import axios from 'axios'; const MyApiScreen = () => { const [data, setData] = useState(null); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const fetchData = async () => { setLoading(true); setError(null); try { const response = await axios.get('https://api.publicapis.org/entries'); setData(response.data); } catch (err) { setError(err.message); } finally { setLoading(false); } }; useEffect(() => { fetchData(); }, []); if (loading) { return <ActivityIndicator size="large" color="#0000ff" />; } if (error) { return ( <View> <Text>Error: {error}</Text> <Button title="Retry" onPress={fetchData} /> </View> ); } return ( <View> <Text>Data: {JSON.stringify(data)}</Text> </View> ); }; export default MyApiScreen;
Retroalimentación
-
Errores Comunes:
- No verificar si la respuesta HTTP es exitosa al usar
fetch
. - No manejar errores de red adecuadamente, lo que puede llevar a una mala experiencia de usuario.
- No mostrar un indicador de carga mientras se realiza la solicitud.
- No verificar si la respuesta HTTP es exitosa al usar
-
Consejos:
- Siempre verifica el estado de la respuesta HTTP al usar
fetch
. - Utiliza
axios
para simplificar el manejo de errores. - Proporciona retroalimentación visual al usuario mientras se realiza la solicitud (por ejemplo, un indicador de carga).
- Siempre verifica el estado de la respuesta HTTP al usar
Conclusión
En esta lección, hemos aprendido cómo manejar errores de red en React Native utilizando fetch
y axios
. El manejo adecuado de errores es esencial para crear aplicaciones robustas y ofrecer una buena experiencia de usuario. En la próxima lección, exploraremos cómo utilizar AsyncStorage
para almacenar datos localmente en la aplicación.
Curso de React Native
Módulo 1: Introducción a React Native
- ¿Qué es React Native?
- Configuración del Entorno de Desarrollo
- Aplicación Hola Mundo
- Entendiendo JSX
- Componentes y Props
Módulo 2: Componentes Básicos y Estilizado
- Visión General de Componentes Básicos
- Texto, Vista e Imagen
- Estilizado con Flexbox
- Manejo de Entrada del Usuario
- ScrollView y ListView
Módulo 3: Estado y Ciclo de Vida
- Métodos de Estado y Ciclo de Vida
- Manejo de Eventos
- Renderizado Condicional
- Listas y Claves
- Formularios y Componentes Controlados
Módulo 4: Navegación
- Introducción a React Navigation
- Navegador de Pila
- Navegador de Pestañas
- Navegador de Cajón
- Pasando Parámetros a Rutas
Módulo 5: Redes y Datos
- Obteniendo Datos con Fetch API
- Usando Axios para Solicitudes HTTP
- Manejo de Errores de Red
- AsyncStorage para Datos Locales
- Integración con APIs REST
Módulo 6: Conceptos Avanzados
Módulo 7: Despliegue y Publicación
- Construyendo para iOS
- Construyendo para Android
- Publicando en App Store
- Publicando en Google Play
- Integración y Entrega Continua