React Navigation 5.x — Organização de Rotas e Nested Routes (Aninhamento de Rotas)

Adonai Pinheiro
Nerdzão/Nerdgirlz
Published in
5 min readJul 22, 2020

Com o passar dos anos o React Native vem se consolidando cada vez mais como um Framework para desenvolvimento de aplicativos móveis. E quase ao mesmo tempo que seu próprio core é atualizado, as bibliotecas, que tornam esse mundo mais interessante, também são. E para este caso, a biblioteca de navegação React Navigation vem sofrido diversas alterações desde seu lançamento.

Uma das coisas que mais me incomodam durante o desenvolvimento é a desorganização e a falta de estruturação do projeto, o que se aplica também as pastas do projeto. Eu acredito que um código bem organização, modularizado na medida do possível é um grande impulsionador na qualidade e tempo do desenvolvimento.

Neste artigo mostrarei, utilizando o React Native 0.60+ e React Navigation 5.x, como eu organizo, estruturo e faço meus aninhamentos de rotas.

Vale lembrar que existem milhões de jeitos de se chegar a um mesmo resultado e estarei mostrando o que funcionou para mim e tornou o meu entendimento e aprendizagem sobre RN 5.x mais fácil.

Bom chega de papo e mãos à obra! 😬

Como seguiremos:

  1. Criar o projeto do zero com npx ( React Native CLI) e utilizando o template Typescript do RN.
  2. Organizar arquivos iniciais e fazer o nosso “Hello World” da primeira tela.
  3. Instalar as bibliotecas do React Navigation 5.x. Vamos utilizar neste artigo a Stack e Drawer navigators.
  4. Organizar nossa estrutura inicial de pastas e rotas.
  5. Criar nossas Nested Routes!

1. Criando o Projeto

Para iniciarmos nossa aventura, vamos rodar o comando abaixo:

npx react-native init RNNestedRoutes --template react-native-template-typescript

Tudo o que precisamos é esperar e assim que concluir todo o processo podemos entrar na pasta do projeto e abrir no nosso editor de texto preferido (VS Code 🤫🤧 coof coof).

cd RNNestedRoutes && code .

Por via das dúvidas vamos rodar o projeto para sabermos se está buildando certinho.

yarn ios

No caso do android, certifique-se de estar com o emulador aberto.

Se tudo der certo você chegará na mesma tela que eu e terá a mesma estrutura inicial que a minha:

Caso queira saber mais clique aqui.

2. Organizar arquivos iniciais

Neste ponto nós seguiremos algumas etapas:

  • Apagar arquivo App.tsx.
  • Criar uma pasta na root do projeto chamada “src”.
  • Dentro da pasta src, vamos criar o arquivo index.tsx.

Você terá este resultado:

Organização de Pastas

Arquivo index.tsx:

  • Alterar o arquivo index.js da root para (estaremos apontando para a pasta “src”):

E chegaremos neste resultado:

3. Instalar as bibliotecas do React Navigation

Vamos seguir neste passo todo o Getting Started da própria documentação do React Navigation (clique aqui).

1- Instalar o React Navigation

yarn add @react-navigation/native

2- Instalar as demais dependências exigidas

yarn add react-native-reanimated react-native-gesture-handler react-native-screens react-native-safe-area-context @react-native-community/masked-view

3- Instalar a Stack Navigator

yarn add @react-navigation/stack

4- Instalar o Drawer Navigator

yarn add @react-navigation/drawer

5- No caso do Mac, vamos rodar o comando abaixo:

cd ios && pod install && cd ..

Agora, vamos voltar no arquivo index.js da root e adicionar a linha de comando especificada na documentação.

Recomendo parar o Metro Bundler e rodar novamente o “yarn ios” ou “yarn android”.

Até aqui o que esperamos é que tenhamos ainda o mesmo resultado do passo 2.

4. Organizar nossa estrutura

Tentaremos seguir a estrutura que desenhei acima. Teremos um root navigator, uma das rotas será para o fluxo de login/cadastro e outro interno para o fluxo de home/perfil.

Bom, vamos lá…

Dentro de src, criaremos um arquivo routes.tsx, uma pasta routes e outra screens.

  • Dentro das pastas routes e screens, criaremos mais duas pastas public e private.
  • Na pasta routes também criaremos um arquivo chamado _rootNavigator.tsx.

Como imagem abaixo:

Vou aproveitar essa seção também para já deixar criadas as pastas das telas propriamente ditas. Vou criar dentro de src->screens->public as pastas de LogIn e Register e dentro de src->screens->public as pastas de Profile e Home. Todas com um index.tsx dentro, sem styles.ts, por exemplo, já que esse não é o objetivo deste artigo.

Também criaremos dois arquivos na pasta routes. Um chamado publicNavigator.tsx, dentro da pasta public e outro privateNavigator.tsx dentro da pasta private.

À primeira vista parece muito confuso e com uma complexibilidade desnecessária, porém lembre-se que estamos pensando, além de organização, escalabilidade. Imagine uma app com 5, 10, 20, 50 telas!!!

5. Criar nossas Nested Routes

Agora vamos para o que interessa!!!

Primeiramente, colocarei em cada screen somente uma View com um Text dentro escrito o nome da Tela. Algo parecido com o que já fizemos…

Exemplo da nossa Dashboard:

Agora tendo pelo menos algo para mostrarmos em tela, vamos acessar o arquivo _rootNavigator.tsx e criaremos nossa primeira stack!

Você pode perceber que existem algumas coisas “faltando”, mas não se preocupe, se tudo ocorrer bem até o final, perceberá que todas as peças vão se encaixando.

Vamos criar também, respectivamente, o publicNavigator e o privateNavigator.

Dentro do publicNavigator.tsx da public:

Dentro do privateNavigator.tsx da private (lembrando que a private é um Drawer):

Com tudo isto feito, vamos até o arquivo routes.tsx da src e importamos nosso rootNavigator dentro do NavigationContainer.

E o Grand Finale para sabermos se está tudo se conversando é alterar o arquivo index.tsx da src, importando nossas Routes.

Nosso resultado:

Vamos colocar alguns botões para navegarmos e testar essa parada ae?

Bom, esperam que tenham gostado! Aproveitem!

Link do repositório: https://github.com/adonaipinheiro/RNNestedRoutes

Se te ajudou, deixe uma estrela ⭐️

Obs.: Faço essa divisão pois acredito que tudo tem seu devido lugar… Imagine que mais para frente, no arquivo index.tsx da src nós colocaríamos um Redux da vida…

Até!

--

--

Adonai Pinheiro
Nerdzão/Nerdgirlz

Sou desenvolvedor há 8 anos. E espero conseguir ajudar e compartilhar um pouco do que aprendi estudando com a comunidade de desenvolvimento.