Olá! Sejam muito bem-vindos a mais este curso de React Native. Estamos aqui para explorar a navegação no desenvolvimento mobile. Meu nome é Vinícius Neves, conhecido como o "Deve Careca Barbuda" da Alura, e estarei acompanhando vocês no desenvolvimento do Focus.
Audiodescrição: Vinícius é um homem branco, com barba e cabelo raspado. Ele veste uma camiseta preta e está em um ambiente de estúdio com fundo neutro.
Este curso é uma continuação direta do curso anterior, onde começamos apenas com a tela do Pomodoro. Desenvolvemos um cronômetro que possui as funções de Focus, pausa curta e pausa longa. Agora, o que faremos? Observem o tamanho deste Figma; há mais telas para desenvolvermos. Temos uma tela inicial, um menu de navegação, uma tela para listar tarefas, onde as tarefas podem ser marcadas como completas ou não. Também adicionaremos tarefas, entre outras funcionalidades.
Vamos observar o aplicativo em funcionamento. Estou com um simulador na tela e vou administrar o VS Code.
Temos nossa lista de tarefas, que finalizamos com três itens: estudar JavaScript, estudar React Native, e a tela do temporizador do Pomodoro. Ao recarregar, ainda visualizamos nossa tela inicial, onde não exibimos o menu de navegação. Precisamos clicar em "quero iniciar". Há muitos aspectos interessantes para aprendermos neste curso.
Como vamos focar no React Native, é essencial que tenhamos conhecimento prévio em React e na Context API do React. Os pré-requisitos estarão detalhados, mas se já dominamos o React e completamos o curso anterior, estamos aptos a continuar desenvolvendo este aplicativo.
Vamos começar a desenvolver. Estamos animados para implementar todas essas funcionalidades. Vamos transformar o aplicativo de uma tela estática e única em um aplicativo com várias telas, navegação, segmentação dinâmica e cuidado com o scroll. Há muito para aprender, e a jornada será incrível.
Vamos desenvolver o projeto Focus, que está aguardando para ser trabalhado. A primeira etapa é ressuscitar o projeto do curso anterior. Se completamos o curso anterior, teremos a mesma base de código. Caso contrário, podemos acessar o link para o projeto base na seção de preparação do ambiente, começando assim do mesmo ponto.
Atualmente, estamos com o Figma do projeto aberto para discutir o que será feito. No simulador do iOS, nossa aplicação já gerencia o Pomodoro, com foco, pausa curta, pausa longa e cronômetro funcionando, permitindo pausar e iniciar. Neste curso, desenvolveremos mais telas. No Figma, podemos ver que teremos uma tela inicial de boas-vindas, permitindo iniciar a aplicação. Em seguida, teremos a página do Pomodoro, que já existe, e um menu de navegação chamado Drawer. Este menu lista o timer (Pomodoro) e a lista de tarefas, que será desenvolvida ao longo das aulas. Vamos criar, editar, excluir e marcar tarefas como completadas, uma funcionalidade nova que requer um fluxo de navegação.
Dentro do ecossistema do Expo, utilizaremos o Expo Router. A documentação está disponível em expo.expo.dev.router.advanced.stack. O conceito de stack (pilha) será utilizado para empilhar a navegação, permitindo retornar à página anterior. Vamos implementar essa navegação.
A documentação é a fonte de verdade sobre o funcionamento do Expo e do router. Um arquivo que deletamos no curso anterior, mas que agora será necessário, é o layout base. Dentro da pasta "app", a documentação sugere criar o arquivo _layout.jsx
, pois não estamos usando TypeScript. Neste arquivo, importaremos o stack para que o React Native e o Expo reconheçam a navegação.
import { Stack } from 'expo-router/stack';
export default function Layout() {
return <Stack />;
}
O Expo identifica telas diferentes pela estrutura de arquivos na pasta "app". Por exemplo, ao criar um arquivo pomodoro.jsx
, o Expo Router reconhecerá que há uma tela com o caminho relativo "pomodoro". Se já trabalhamos com Next.js, o conceito é semelhante. Caso contrário, não é necessário se preocupar, pois controlaremos as telas com base nos nomes dos arquivos e pastas.
Criamos o arquivo pomodoro.jsx
porque o comportamento atual da página inicial é o Pomodoro, mas queremos que essa funcionalidade fique no arquivo pomodoro
.
export default function Pomodoro() {
// Conteúdo do Pomodoro
}
Vamos transferir todo o conteúdo do arquivo index.jsx
para dentro do componente Pomodoro. Como estamos no mesmo nível de diretório, basta usar "Ctrl+X" para cortar e colar. Um detalhe importante é que, na linha 29, onde antes fazíamos o export default function index
, não queremos mais chamar de index
, pois essa tela não é mais a página inicial. Vamos chamá-la de Pomodoro. Após salvar, no nosso index.js
, criaremos uma nova função para representar a tela inicial. No Figma, podemos ver que essa é a nossa tela inicial. Não queremos iniciar diretamente no Pomodoro, por exemplo, então começaremos criando o componente React.
Vamos fazer um export default function
e chamá-lo de index
, pois essa será a nossa tela inicial. Retornaremos o JSX e podemos aproveitar para fazer um refresh. Não podemos retornar texto puro, pois estamos no ambiente do React Native. Portanto, criaremos uma View
(com V maiúsculo). O VS Code já sugere importar a View
do React Native, e faremos isso. Também não podemos inserir texto diretamente; devemos usar o componente Text
do React Native. Novamente, o VS Code sugere a importação, e confirmamos. Chamaremos de "home" e, por enquanto, será isso. Alteramos nossa página inicial, e o Expo já reconhece que o index.jsx
é a tela inicial. Agora temos o Pomodoro, que é uma navegação que podemos criar. No simulador, aparece "home" no canto superior esquerdo.
import { Text, View } from "react-native";
export default function Index() {
return (
<View>
<Text>Home</Text>
</View>
);
}
Para fazer a navegação entre telas no ecossistema do React Native, que é amigável para quem já conhece React, usaremos um componente chamado Link
, importado do ExpoRouter
. Dentro do texto, colocaremos "quero iniciar", que será o botão da tela. Para definir para onde o link levará, usaremos um href
. Em vez de passar diretamente a URL, passamos um objeto de configuração com a informação pathName
, que funciona como um endereço da web. O pathName
será "/Pomodoro", que é nossa página Pomodoro. O nome do arquivo coincide com o pathName
, e não precisamos incluir .jsx
, apenas "/Pomodoro".
import { Text, View } from "react-native";
import { Link } from "expo-router";
export default function Index() {
return (
<View>
<Text>Home</Text>
<Link href={{ pathname: '/pomodoro' }}>
Quero iniciar!
</Link>
</View>
);
}
Vamos testar no simulador. O botão "quero iniciar" aparece sem estilo, pois ainda não aplicamos nenhum. Ao clicar, se houver um erro dizendo que não encontrou a rota pathName Pomodoro
, podemos resolver parando o npm start
no terminal e executando novamente. Após recarregar a página, o botão "quero iniciar" funcionará. Quando mudamos muito a estrutura de arquivos, o Expo pode não conseguir fazer o hot reload corretamente. Paramos o npm start
, executamos novamente, e agora o Expo adiciona um cabeçalho automaticamente. O botão de voltar também é gerado pelo Expo, permitindo retornar à index
.
Concluímos nossa primeira navegação entre telas, mas ainda estamos longe do resultado final desejado. Este é apenas o primeiro passo, mas foi muito importante. Nos encontramos no próximo vídeo para continuar.
Já temos nosso fluxo de navegação entre telas funcionando. Nossa página inicial está exibindo um cabeçalho que não era exibido anteriormente, e o Stack está fazendo isso por nós. O botão "Quero Iniciar" está direcionando para a página de Pomodoro. No entanto, essa página de Pomodoro agora possui um cabeçalho que não deveria estar presente, conforme o layout no Figma. Precisamos customizar isso.
Para remover o cabeçalho da página de Pomodoro, vamos ao VS Code e abrimos o arquivo layout_underline_layout.jsx
. É nesse arquivo que faremos a configuração da nossa rota específica. Inicialmente, temos o retorno do stack como uma tag de fechamento automático:
return <Stack>
</Stack>;
Para permitir customizações, colocaremos tudo entre parênteses, abrindo e fechando o stack:
return (<Stack>
</Stack>);
Dentro do stack, chamaremos outro componente que começa com stack, mas não queremos um stack dentro de outro stack. Queremos um componente chamado screen
. Vamos usar stack.screen
para definir a tela:
<Stack.Screen />
Precisamos informar ao stack qual é o nome ou path name dessa tela específica. Vamos configurar o nome como "pomodoro":
<Stack.Screen name='pomodoro'/>
Para essa tela específica, podemos fazer várias customizações. Podemos passar, como propriedade para o stack.screen
, uma prop chamada options
:
<Stack.Screen name='pomodoro' options={{}}/>
Ao pressionar control + espaço, o VS Code mostrará todas as opções disponíveis, como title, status bar, header title, entre outras. Queremos uma opção específica: esconder o cabeçalho. Para isso, usamos a prop headerShown
. Por padrão, esse valor é true, o que significa que o stack exibe o cabeçalho automaticamente. Para esconder o cabeçalho, definimos headerShown
como false:
options={{ headerShown: false }}
Isso ativará o hot reload, e o cabeçalho não aparecerá mais no simulador. Vamos quebrar algumas linhas para melhorar a legibilidade do código, como no name
, options
e ao fechar o stack.screen
:
<Stack.Screen
name='pomodoro'
options={{ headerShown: false }}
/>
Essa é a estrutura básica de um roteador. Nosso stack possui vários tipos de roteadores diferentes, mas ele contém telas, e essas telas possuem opções configuráveis.
Repare que essa configuração é totalmente opcional. Se comentarmos esse código, ele retornará com o header, e o comportamento continuará o mesmo:
{/* <Stack.Screen
name='pomodoro'
options={{ headerShown: false }}
/> */}
Quando devemos intervir no layout, dentro do stack, e especificar algo para o router? Quando queremos customizar. Quando desejamos tratar um caso especial e indicar que, nesse caso específico, o comportamento deve ser diferente. Foi isso que fizemos agora. No caso da tela Pomodoro, decidimos não exibir o header. Assim, o headerShown
(ou seja, "exibe o header") está configurado como falso. Não queremos que o header seja exibido.
Dessa forma, configuramos partes específicas de uma tela dentro do ExpoRouter. Como estamos preparando nosso projeto para receber novas funcionalidades, há mais uma tarefa a ser feita: organizar as imagens que temos. Dentro da pasta app
, temos os arquivos long.png
, pomodoro.png
e short.png
. Atualmente, essas imagens estão na raiz do projeto. Como mencionado anteriormente, nosso roteador fará o roteamento baseado em nomes de partes e arquivos. Podemos usar a estrutura do próprio Expo para melhorar essa organização. Em vez de manter as imagens na raiz do projeto, vamos movê-las para a pasta "Assets".
Após mover as imagens, o compilador indicará que não consegue mais encontrar o arquivo pomodoro.png
. Precisamos ajustar o caminho para essa imagem no arquivo pomodoro.jsx
. Nas linhas 12, 18 e 24, o caminho não é mais ./nome_da_imagem
. Agora, devemos voltar uma pasta, acessar "Assets", e dentro de "Assets", acessar a pasta "Imagem", onde está o arquivo pomodoro.png
:
image: require('../assets/images/pomodoro.png'),
Vamos aplicar esse mesmo caminho relativo para o Require
e corrigir os outros arquivos:
image: require('../assets/images/short.png'),
image: require('../assets/images/long.png'),
Após salvar, pediremos ao emulador para tentar executar novamente. Se ocorrer algum problema, como o NPM Start se perder, devemos parar e reiniciar o NPM Start, abrir no iOS e fazer um reload. Caso o arquivo pomodoro.png
não seja encontrado, devemos verificar se o nome do arquivo está correto.
Se houver um erro, como tentar acessar diretamente "assets" em vez de "imagens", devemos corrigir. Após ajustar, o Expo deve se recuperar e carregar corretamente. Verificamos se todas as imagens, como pausa curta e pausa longa, estão carregadas. O problema anterior ocorreu porque o nome do arquivo estava correto, mas o caminho estava errado. O Expo não consegue adivinhar automaticamente o que estamos fazendo.
Portanto, movemos nossas imagens para a pasta "imagens" dentro de "assets" e, no nosso layout, temos a customização para a tela do Pomodoro. Estamos progredindo bem, mas ainda há muito a ser feito. Vamos continuar evoluindo este aplicativo, que receberá muitas funcionalidades interessantes.
O curso React Native: navegando entre telas com expo router possui 203 minutos de vídeos, em um total de 64 atividades. Gostou? Conheça nossos outros cursos de em Mobile, ou leia nossos artigos de Mobile.
Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:
Impulsione a sua carreira com os melhores cursos e faça parte da maior comunidade tech.
1 ano de Alura
Assine o PLUS e garanta:
Formações com mais de 1500 cursos atualizados e novos lançamentos semanais, em Programação, Inteligência Artificial, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.
A cada curso ou formação concluído, um novo certificado para turbinar seu currículo e LinkedIn.
No Discord, você tem acesso a eventos exclusivos, grupos de estudos e mentorias com especialistas de diferentes áreas.
Faça parte da maior comunidade Dev do país e crie conexões com mais de 120 mil pessoas no Discord.
Acesso ilimitado ao catálogo de Imersões da Alura para praticar conhecimentos em diferentes áreas.
Explore um universo de possibilidades na palma da sua mão. Baixe as aulas para assistir offline, onde e quando quiser.
Acelere o seu aprendizado com a IA da Alura e prepare-se para o mercado internacional.
1 ano de Alura
Todos os benefícios do PLUS e mais vantagens exclusivas:
Luri é nossa inteligência artificial que tira dúvidas, dá exemplos práticos, corrige exercícios e ajuda a mergulhar ainda mais durante as aulas. Você pode conversar com a Luri até 100 mensagens por semana.
Aprenda um novo idioma e expanda seus horizontes profissionais. Cursos de Inglês, Espanhol e Inglês para Devs, 100% focado em tecnologia.
Transforme a sua jornada com benefícios exclusivos e evolua ainda mais na sua carreira.
1 ano de Alura
Todos os benefícios do PRO e mais vantagens exclusivas:
Mensagens ilimitadas para estudar com a Luri, a IA da Alura, disponível 24hs para tirar suas dúvidas, dar exemplos práticos, corrigir exercícios e impulsionar seus estudos.
Envie imagens para a Luri e ela te ajuda a solucionar problemas, identificar erros, esclarecer gráficos, analisar design e muito mais.
Escolha os ebooks da Casa do Código, a editora da Alura, que apoiarão a sua jornada de aprendizado para sempre.