Ecrã em React Native com Expo e TypeScript com todos os estados
Gere um ecrã de app móvel em React Native e TypeScript com estados de carregamento, vazio, erro e sem ligação, lista otimizada, acessibilidade, área segura e testes com Testing Library. Pensado para ChatGPT, Claude, Gemini e Microsoft Copilot. Inclui 4 variáveis personalizáveis e pode copiá-lo gratuitamente com um clique.
Intermédio · Código · Pendente de revisão editorial
Prompt
Atua como programador mobile sénior especializado em React Native, Expo e TypeScript, com atenção ao desempenho e à acessibilidade em iOS e Android.
Contexto:
- Objetivo do ecrã e ações do utilizador: {{ecra}}
- Origem dos dados (endpoint, forma da resposta, autenticação): {{dados}}
- Biblioteca de navegação: {{navegacao}}
- Estilo visual e bibliotecas já existentes no projeto: {{estilo}}
Entregáveis:
1. Estrutura de ficheiros: ecrã, componentes filhos, hook de dados e tipos.
2. Tipos TypeScript para a resposta da API e as props, sem any.
3. Hook de dados com carregamento, erro, nova tentativa, pull-to-refresh e cancelamento ao desmontar o ecrã. Se o projeto já usar uma biblioteca de obtenção de dados, adapta-te a ela; se não, explica quando compensaria usá-la.
4. Ecrã completo com estados claros: a carregar (esqueleto), vazio com apelo à ação, erro com botão para tentar de novo e sem ligação.
5. Listas com FlatList ou equivalente otimizado: keyExtractor estável, itens memorizados, paginação ou scroll infinito se fizer sentido.
6. Acessibilidade: accessibilityLabel e accessibilityRole, tamanhos mínimos de toque, suporte a tamanho de texto dinâmico e leitura correta com VoiceOver e TalkBack.
7. Layout adaptável: SafeAreaView ou insets, teclado (KeyboardAvoidingView se houver formulários), modo escuro e diferenças entre iOS e Android.
8. Testes com React Native Testing Library para os estados de carregamento, erro e sucesso, com a API simulada.
Restrições:
- Não inventes endpoints nem campos: se faltar a forma da resposta, usa um tipo marcado como [PREENCHER] e pergunta-me.
- Não acrescentes dependências sem justificar porquê e sem indicar a alternativa sem dependência.
- Se o ecrã ou o fluxo não forem claros, pergunta-me antes de escrever o código.
Formato: secções numeradas, um bloco de código por ficheiro e notas breves sobre as decisões.Como utilizar
Cola um exemplo real da resposta JSON da tua API e indica as bibliotecas que já usas. Testa o ecrã num dispositivo iOS e num Android, em modo de avião e com o tamanho de letra no máximo.
Exemplo de utilização
Ecrã: lista de encomendas do utilizador com filtro por estado e detalhe ao tocar · Dados: GET /orders paginado com token · Navegação: Expo Router · Estilo: StyleSheet com as cores da marca.
Exemplo de resultado
3. Hook de dados — hooks/useReceitas.ts
import { useCallback, useEffect, useRef, useState } from 'react';
export type Receita = { id: string; titulo: string; imagem: string; minutos: number }; // tipo do id: [COMPLETAR]
type RespostaReceitas = { items: Receita[]; total: number };
type Estado = 'a_carregar' | 'erro' | 'ok';
const API_URL = process.env.EXPO_PUBLIC_API_URL;
export function useReceitas(pesquisa: string) {
const [receitas, setReceitas] = useState<Receita[]>([]);
const [estado, setEstado] = useState<Estado>('a_carregar');
const [aAtualizar, setAAtualizar] = useState(false);
const controlador = useRef<AbortController | null>(null);
const carregar = useCallback(async (eRefresh = false) => {
controlador.current?.abort(); // cancela o pedido anterior
const ctrl = new AbortController();
controlador.current = ctrl;
if (eRefresh) setAAtualizar(true); else setEstado('a_carregar');
try {
// Nome do parâmetro de pesquisa: [COMPLETAR]
const params = new URLSearchParams({ pagina: '1', q: pesquisa });
const res = await fetch(`${API_URL}/api/receitas?${params}`, { signal: ctrl.signal });
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const dados = (await res.json()) as RespostaReceitas;
setReceitas(dados.items);
setEstado('ok');
} catch {
if (!ctrl.signal.aborted) setEstado('erro');
} finally {
if (!ctrl.signal.aborted) setAAtualizar(false);
}
}, [pesquisa]);
useEffect(() => {
carregar();
return () => controlador.current?.abort(); // quando o ecrã é desmontado
}, [carregar]);
return { receitas, estado, aAtualizar, tentarDeNovo: () => carregar(), atualizar: () => carregar(true) };
}
Sem dependências novas: se a app crescer (cache entre ecrãs, paginação infinita), passa a compensar uma biblioteca de data fetching. O ecrã usa estado para mostrar o skeleton, o erro com botão «Tentar de novo» ou a FlatList…
Dados-chave
- Categoria
- Programação e desenvolvimento · Aplicações móveis
- Tipo de resultado
- Código
- Nível
- Intermédio
- Pensado para
- ChatGPT, Claude, Gemini e Microsoft Copilot
- Verificado em
- Pendente de verificação editorial
- Variáveis
- Objetivo do ecrã, Origem dos dados, Navegação e Estilo e bibliotecas
- Idioma
- Português
- Preço
- Gratuito, sem registo
- Atualizado
- 07/11/2026
Perguntas frequentes
O código serve para uma app sem Expo?
Quase todo, porque os componentes e hooks são de React Native. Mudam as partes que usam módulos do Expo, como a deteção de ligação ou as fontes; pede ao modelo a alternativa para React Native CLI.
Porquê tantos estados para um só ecrã?
Porque a rede móvel falha muitas vezes e um ecrã em branco parece uma app avariada. Mostrar carregamento, vazio, erro e sem ligação melhora a experiência e reduz avaliações negativas.
Para que serve este prompt?
Gere um ecrã de app móvel em React Native e TypeScript com estados de carregamento, vazio, erro e sem ligação, lista otimizada, acessibilidade, área segura e testes com Testing Library.
Com que ferramentas de IA funciona?
Foi pensado para ChatGPT, Claude, Gemini e Microsoft Copilot. Ainda não o verificámos nestas ferramentas, pelo que os resultados podem variar entre elas.
Como personalizo o prompt?
Clique em “Personalizar” e preencha as variáveis (Objetivo do ecrã, Origem dos dados, Navegação e Estilo e bibliotecas). O texto atualiza-se instantaneamente e pode depois copiá-lo com um clique. Os valores ficam guardados apenas no seu navegador.
Preciso de experiência para o utilizar?
É de nível intermédio: convém conhecer o tema para fornecer bom contexto e rever o resultado com sentido crítico.
Este prompt é gratuito?
Sim. Todos os prompts do HomeCasa Prompts são gratuitos, sem registo nem subscrição. Pode também utilizá-los em projetos profissionais.
Posso confiar no resultado da IA?
Trate-o como um rascunho de qualidade: verifique sempre os dados, os números e as afirmações importantes antes de publicar ou tomar decisões.