Navegação
React Native • Módulo 1: Fundamentos • Codding — material para estudo offline
Aluno: ______________________________ Data: ____ / ____ / ______
Nesta aula, você vai compreender Navegação com explicação progressiva, exemplo resolvido, checagens e prática. Nada de apenas copiar: cada etapa prepara a próxima.
Objetivos da aula
- Explicar Navegação com suas próprias palavras
- Reconhecer as partes importantes em um exemplo real
- Identificar e corrigir os erros mais frequentes
- Aplicar o conteúdo em uma atividade prática
Pré-requisito: Leia a aula anterior do módulo se algum termo parecer novo. Você pode testar o exemplo antes de continuar. • Duração: 50–75 min
Explicação passo a passo
1. O que é Navegação
React Native usa os mesmos conceitos do React (componentes, props, estado), mas renderiza componentes nativos: nada de div e p — são View, Text, Image, Pressable.
Checkpoint: Qual componente substitui a <div> no React Native? — Resposta: View
2. Como pensar antes de fazer
Estilos usam objetos JavaScript com um subconjunto de CSS, sempre em Flexbox (com flexDirection: 'column' como padrão, ao contrário da web). Não existe cascata: cada componente carrega o próprio estilo.
Dica: Não decore a forma. Tente explicar com suas palavras qual problema “Navegação” resolve.
3. Exemplo completo, do início ao resultado
Navegação é uma biblioteca à parte (stack, tabs, drawer) que gerencia a pilha de telas e os gestos nativos de voltar. Pense em cada tela como um componente que recebe parâmetros da rota.
import { View, Text, Pressable, StyleSheet } from "react-native";
import { useState } from "react";
export default function Contador() {
const [n, setN] = useState(0);
return (
<View style={s.box}>
<Text style={s.num}>{n}</Text>
<Pressable style={s.btn} onPress={() => setN(n + 1)}>
<Text style={s.txt}>Somar</Text>
</Pressable>
</View>
);
}
const s = StyleSheet.create({
box: { flex: 1, alignItems: "center", justifyContent: "center", gap: 16 },
num: { fontSize: 48, fontWeight: "700" },
btn: { backgroundColor: "#2563eb", paddingHorizontal: 20, paddingVertical: 12, borderRadius: 12 },
txt: { color: "white", fontWeight: "600" },
});| Trecho | O que faz |
|---|
import { View, Text, Pressable, StyleSheet } from "react-native"; | Carrega um recurso que será utilizado nas próximas linhas. |
import { useState } from "react"; | Carrega um recurso que será utilizado nas próximas linhas. |
export default function Contador() { | Cria uma estrutura reutilizável para organizar comportamento. |
const [n, setN] = useState(0); | Cria ou atualiza um valor que será usado pelo restante do exemplo. |
return ( | Produz ou devolve o resultado que permite conferir a execução. |
<View style={s.box}> | Define uma parte da estrutura visível ou semântica da página. |
<Text style={s.num}>{n}</Text> | Define uma parte da estrutura visível ou semântica da página. |
<Pressable style={s.btn} onPress={() => setN(n + 1)}> | Define uma parte da estrutura visível ou semântica da página. |
Dica: Mesma lógica de estado do React web; muda o vocabulário de componentes e o estilo em objeto.
Checkpoint: Qual é o flexDirection padrão no React Native? — Resposta: column
4. Do detalhe para o todo
O que mais diferencia mobile: permissões, estados offline, tamanhos de tela e ciclo de vida do app em background. Teste em aparelho real cedo — o emulador esconde problemas de desempenho e de toque.
5. Erros comuns e como corrigi-los
1. Tentar usar tags HTML (div, span) — não existem.
2. Esquecer que o padrão do flexDirection é column.
3. Testar só no emulador e descobrir a lentidão no lançamento.
Dica: Quando algo der errado, compare uma diferença por vez com o exemplo. Evite mudar várias partes ao mesmo tempo.
Prática guiada
1. 1. Faça funcionar
Laboratório de Navegação: execute o exemplo, identifique entrada, processamento e saída e altere pelo menos um valor para observar como o resultado muda.
import { View, Text, Pressable, StyleSheet } from "react-native";
import { useState } from "react";
export default function Contador() {
const [n, setN] = useState(0);
return (
<View style={s.box}>
<Text style={s.num}>{n}</Text>
<Pressable style={s.btn} onPress={() => setN(n + 1)}>
<Text style={s.txt}>Somar</Text>
</Pressable>
</View>
);
}
const s = StyleSheet.create({
box: { flex: 1, alignItems: "center", justifyContent: "center", gap: 16 },
num: { fontSize: 48, fontWeight: "700" },
btn: { backgroundColor: "#2563eb", paddingHorizontal: 20, paddingVertical: 12, borderRadius: 12 },
txt: { color: "white", fontWeight: "600" },
});Dica: Volte ao exemplo resolvido e compare a estrutura. Tentar usar tags HTML (div, span) — não existem.
2. 2. Preveja antes de testar
Sem executar, explique qual resultado o exemplo de Navegação deve produzir e qual parte é responsável por ele.
Minha previsão:
A parte responsável pelo resultado:
Como vou conferir:
Dica: Use o modelo mental da aula: entrada, transformação e evidência observável.
3. 3. Encontre e corrija o erro
Use o exemplo de Navegação, identifique um risco citado na aula e registre ou implemente a correção.
import { View, Text, Pressable, StyleSheet } from "react-native";
import { useState } from "react";
export default function Contador() {
const [n, setN] = useState(0);
return (
<View style={s.box}>
<Text style={s.num}>{n}</Text>
<Pressable style={s.btn} onPress={() => setN(n + 1)}>
<Text style={s.txt}>Somar</Text>
</Pressable>
</View>
);
}
const s = StyleSheet.create({
box: { flex: 1, alignItems: "center", justifyContent: "center", gap: 16 },
num: { fontSize: 48, fontWeight: "700" },
btn: { backgroundColor: "#2563eb", paddingHorizontal: 20, paddingVertical: 12, borderRadius: 12 },
txt: { color: "white", fontWeight: "600" },
});Dica: Tentar usar tags HTML (div, span) — não existem.
4. 4. Aplique em um caso novo
Crie uma variação própria usando Navegação. Mude os dados ou o cenário e demonstre que o resultado continua correto.
import { View, Text, Pressable, StyleSheet } from "react-native";
import { useState } from "react";
export default function Contador() {
const [n, setN] = useState(0);
return (
<View style={s.box}>
<Text style={s.num}>{n}</Text>
<Pressable style={s.btn} onPress={() => setN(n + 1)}>
<Text style={s.txt}>Somar</Text>
</Pressable>
</View>
);
}
const s = StyleSheet.create({
box: { flex: 1, alignItems: "center", justifyContent: "center", gap: 16 },
num: { fontSize: 48, fontWeight: "700" },
btn: { backgroundColor: "#2563eb", paddingHorizontal: 20, paddingVertical: 12, borderRadius: 12 },
txt: { color: "white", fontWeight: "600" },
});Dica: Mantenha a estrutura que já funcionou e altere uma decisão por vez.
Revisão
- React Native usa os mesmos conceitos do React (componentes, props, estado), mas renderiza componentes nativos: nada de div e p — são View, Text, Image, Pressable.
- Mesma lógica de estado do React web; muda o vocabulário de componentes e o estilo em objeto.
- Evite: Tentar usar tags HTML (div, span) — não existem.
- Evite: Esquecer que o padrão do flexDirection é column.
Exemplo comentado
import { View, Text, Pressable, StyleSheet } from "react-native";
import { useState } from "react";
export default function Contador() {
const [n, setN] = useState(0);
return (
<View style={s.box}>
<Text style={s.num}>{n}</Text>
<Pressable style={s.btn} onPress={() => setN(n + 1)}>
<Text style={s.txt}>Somar</Text>
</Pressable>
</View>
);
}
const s = StyleSheet.create({
box: { flex: 1, alignItems: "center", justifyContent: "center", gap: 16 },
num: { fontSize: 48, fontWeight: "700" },
btn: { backgroundColor: "#2563eb", paddingHorizontal: 20, paddingVertical: 12, borderRadius: 12 },
txt: { color: "white", fontWeight: "600" },
});Mesma lógica de estado do React web; muda o vocabulário de componentes e o estilo em objeto.
Erros comuns
- Tentar usar tags HTML (div, span) — não existem.
- Esquecer que o padrão do flexDirection é column.
- Testar só no emulador e descobrir a lentidão no lançamento.
Quiz e gabarito completo
1. Qual componente substitui a <div> no React Native?
- a) Box
- b) View
- c) Container
- d) Div
Gabarito: b) View — View é o contêiner básico de layout.
2. Qual é o flexDirection padrão no React Native?
- a) row
- b) column
- c) row-reverse
- d) não há padrão
Gabarito: b) column — Ao contrário da web, o padrão é column.
Codding • React Native • Navegação • Prova final e certificado em codding.lovable.app/cursos/react-native/prova