Pantalla de React Native con Expo y TypeScript con todos sus estados
Genera una pantalla de app móvil en React Native y TypeScript con estados de carga, vacío, error y sin conexión, lista optimizada, accesibilidad, zona segura y tests con Testing Library. Pensado para ChatGPT, Claude, Gemini y Microsoft Copilot. Incluye 4 variables personalizables y se copia gratis en un clic.
Intermedio · Código · Pendiente de revisión editorial
Prompt
Actúa como desarrollador móvil sénior especializado en React Native, Expo y TypeScript, con atención al rendimiento y a la accesibilidad en iOS y Android.
Contexto:
- Propósito de la pantalla y acciones del usuario: {{pantalla}}
- Origen de los datos (endpoint, forma de la respuesta, autenticación): {{datos}}
- Librería de navegación: {{navegacion}}
- Estilo visual y librerías ya presentes en el proyecto: {{estilo}}
Entregables:
1. Estructura de archivos: pantalla, componentes hijos, hook de datos y tipos.
2. Tipos TypeScript para la respuesta de la API y las props; sin any.
3. Hook de datos con carga, error, reintento, pull-to-refresh y cancelación al desmontar la pantalla. Si el proyecto ya usa una librería de datos, adáptate a ella; si no, explica cuándo convendría usar una.
4. Pantalla completa con estados claros: cargando (esqueleto), vacío con llamada a la acción, error con botón de reintentar y sin conexión.
5. Listas con FlatList o equivalente optimizado: keyExtractor estable, componentes memorizados, paginación o scroll infinito si aplica.
6. Accesibilidad: accessibilityLabel y accessibilityRole, tamaños táctiles mínimos, soporte para tamaño de texto dinámico y lectura correcta con VoiceOver y TalkBack.
7. Diseño adaptado: SafeAreaView o insets, teclado (KeyboardAvoidingView si hay formularios), modo oscuro y diferencias entre iOS y Android.
8. Tests con React Native Testing Library para los estados de carga, error y éxito, con la API simulada.
Restricciones:
- No inventes endpoints ni campos: si falta la forma de la respuesta, usa un tipo marcado como [COMPLETAR] y pregúntame.
- No añadas dependencias nuevas sin justificar el porqué y la alternativa sin dependencia.
- Si la pantalla o el flujo no están claros, pregúntame antes de escribir el código.
Formato: secciones numeradas, un bloque de código por archivo y notas breves de decisiones.Cómo usarlo
Pega un ejemplo real de la respuesta JSON de tu API y menciona las librerías que ya tienes. Prueba la pantalla en un dispositivo iOS y otro Android, con el modo avión activado y con el tamaño de letra al máximo.
Ejemplo de uso
Pantalla: lista de pedidos del usuario con filtro por estado y detalle al pulsar · Datos: GET /orders paginado con token · Navegación: Expo Router · Estilo: StyleSheet, colores de marca.
Resultado de ejemplo
3. Hook de datos — hooks/useRecetas.ts
import { useCallback, useEffect, useRef, useState } from 'react';
export type Receta = { id: string; titulo: string; imagen: string; minutos: number }; // tipo de id: [COMPLETAR]
type RespuestaRecetas = { items: Receta[]; total: number };
type Estado = 'cargando' | 'error' | 'ok';
const API_URL = process.env.EXPO_PUBLIC_API_URL;
export function useRecetas(busqueda: string) {
const [recetas, setRecetas] = useState<Receta[]>([]);
const [estado, setEstado] = useState<Estado>('cargando');
const [refrescando, setRefrescando] = useState(false);
const controlador = useRef<AbortController | null>(null);
const cargar = useCallback(async (esRefresco = false) => {
controlador.current?.abort(); // cancela la petición anterior
const ctrl = new AbortController();
controlador.current = ctrl;
if (esRefresco) setRefrescando(true); else setEstado('cargando');
try {
// Nombre del parámetro de búsqueda: [COMPLETAR]
const params = new URLSearchParams({ pagina: '1', q: busqueda });
const res = await fetch(`${API_URL}/api/recetas?${params}`, { signal: ctrl.signal });
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const datos = (await res.json()) as RespuestaRecetas;
setRecetas(datos.items);
setEstado('ok');
} catch {
if (!ctrl.signal.aborted) setEstado('error');
} finally {
if (!ctrl.signal.aborted) setRefrescando(false);
}
}, [busqueda]);
useEffect(() => {
cargar();
return () => controlador.current?.abort(); // al desmontar la pantalla
}, [cargar]);
return { recetas, estado, refrescando, reintentar: () => cargar(), refrescar: () => cargar(true) };
}
Sin dependencias nuevas: si el proyecto crece (caché entre pantallas, paginación infinita), merecería la pena una librería de data fetching. La pantalla usa estado para mostrar skeleton, error con botón «Reintentar» o la FlatList…
Datos clave
- Categoría
- Programación y desarrollo · Aplicaciones móviles
- Tipo de resultado
- Código
- Nivel
- Intermedio
- Pensado para
- ChatGPT, Claude, Gemini y Microsoft Copilot
- Verificado en
- Pendiente de verificación editorial
- Variables
- Propósito de la pantalla, Origen de los datos, Navegación y Estilo y librerías
- Idioma
- Español
- Precio
- Gratis, sin registro
- Actualizado
- 07/11/2026
Preguntas frecuentes
¿Sirve el código para una app sin Expo?
Casi todo sí, porque los componentes y hooks son de React Native. Cambiarán las partes que usen módulos de Expo, como la detección de conexión o las fuentes; pídele al modelo la alternativa para React Native CLI.
¿Por qué tantos estados para una sola pantalla?
Porque en móvil la red falla a menudo y una pantalla en blanco parece un error de la app. Mostrar carga, vacío, error y sin conexión mejora la experiencia y reduce valoraciones negativas.
¿Para qué sirve este prompt?
Genera una pantalla de app móvil en React Native y TypeScript con estados de carga, vacío, error y sin conexión, lista optimizada, accesibilidad, zona segura y tests con Testing Library.
¿Con qué herramientas de IA funciona?
Está pensado para ChatGPT, Claude, Gemini y Microsoft Copilot. Todavía no lo hemos verificado en estas herramientas, por lo que los resultados pueden variar entre ellas.
¿Cómo personalizo el prompt?
Pulsa «Personalizar» y rellena las variables (Propósito de la pantalla, Origen de los datos, Navegación y Estilo y librerías). El texto se actualiza al instante y después puedes copiarlo con un clic. Los valores se guardan solo en tu navegador.
¿Necesito experiencia para usarlo?
Es de nivel intermedio: conviene que conozcas el tema para aportar buen contexto y revisar el resultado con criterio.
¿Este prompt es gratis?
Sí. Todos los prompts de HomeCasa Prompts son gratuitos, sin registro ni suscripción. Puedes usarlos también en proyectos profesionales.
¿Puedo fiarme del resultado de la IA?
Úsalo como un borrador de calidad: revisa siempre datos, cifras y afirmaciones importantes antes de publicarlos o tomar decisiones.