Tipos de navegação no React Native

Existem diversos tipos de navegação que podem ser usadas em um aplicativo com React Native.

Cada um desses tipos possui um objetivo e um tipo de implementação diferentes.

Hoje, vamos entender quando, e como, utilizar cada um deles.

SwitchNavigator

O primeiro tipo de navegação é o SwitchNavigator, ele se destaca por ser o tipo mais simples de navegação.

Esse navigator não vem com nada configurado de forma padrão, o que é muito bom quando você quer criar uma customização própria, sem interferência da biblioteca.

Abaixo podemos ver como se dá a navegação através do SwitchNavigator:

A implementação dessa navegação também é bem simples.

import { createSwitchNavigator, createAppContainer } from 'react-navigation';

import Login from '../pages/Login';
import Dashboard from '../pages/Dashboard';

const mainNavigation = createSwitchNavigator({
  Login,
  Dashboard,
});

export default createAppContainer(mainNavigation);

AnimatedSwitchNavigator

O AnimatedSwitchNavigator segue a mesma ideia de simplicidade do SwitchNavigator, mas esse navigator é utilizado em conjunto com uma biblioteca de animação para que você possa customizar a transição entre as telas do seu app.

Para utilizar o recurso de animação, você precisará instalar duas bibliotecas novas, são elas:

react-navigation-animated-switch
react-native-reanimated

Podemos editar ou até mesmo criar nossas próprias animações através do Transition da biblioteca react-navigation-animated-switch.

import React from 'react';
import { createAppContainer } from 'react-navigation';
import createAnimatedSwitchNavigator from 'react-navigation-animated-switch';
import { Transition } from 'react-native-reanimated';

import Login from '../pages/Login';
import Dashboard from '../pages/Dashboard';

const mainNavigation = createAnimatedSwitchNavigator(
  {
    Login,
    Dashboard,
  },
  {
    transition: (
      <Transition.Together>
        <Transition.Out
          type="slide-bottom"
          durationMs={400}
          interpolation="easeIn"
        />
        <Transition.In type="fade" durationMs={500} />
      </Transition.Together>
    ),
  },
);

export default createAppContainer(mainNavigation);

O valor transition não é obrigatório, caso você não informe esse valor, a própria biblioteca implementará uma animação do tipo fade.


StackNavigator

O Stack Navigation, apesar de simples, já implementa um header e um botão de voltar nas rotas.

É ideal pra quando você quer uma implementação mais simples, ou não tem muito tempo para investir no layout.

É muito comum esse tipo de navigator ser utilizado em conjunto com algum outro navigator.

A implementação desse navigator é bem parecida com a do SwitchNavigator.

import { createStackNavigator, createAppContainer } from 'react-navigation';

import Login from '../pages/Login';
import Dashboard from '../pages/Dashboard';

const mainNavigation = createStackNavigator({
  Login,
  Dashboard,
});

export default createAppContainer(mainNavigation);

DrawerNavigator

Esse tipo navegação é bem conhecido e querido por muitos devs.

Esse navigator adiciona uma sidebar na lateral do aplicativo, o que é excelente pra quando você tem um grande número de rotas visíveis ao usuário.

A implementação desse navigator é bem semelhante aos anteriores.

Para esse exemplo, utilizamos a biblioteca react-native-vector-icons.

import React from 'react';
import { createDrawerNavigator, createAppContainer } from 'react-navigation';
import Icon from 'react-native-vector-icons/FontAwesome';

Icon.loadFont();

import Login from '../pages/Login';
import Dashboard from '../pages/Dashboard';

const mainNavigation = createDrawerNavigator({
  Login: {
    screen: Login,
    navigationOptions: () => ({
      drawerIcon: <Icon name="lock" size={20} color="#7159c1" />,
    }),
  },
  Dashboard: {
    screen: Dashboard,
    navigationOptions: () => ({
      drawerIcon: <Icon name="rocket" size={20} color="#7159c1" />,
    }),
  },
});

export default createAppContainer(mainNavigation);

BottomTabNavigator

Esse é um outro tipo de navegação bem conhecido, implementado por apps como o Airbnb, Instagram, Youtube, Twitter e muitos outros.

Nele, o menu fica na parte de baixo da tela, que gera uma usabilidade muito boa para o usuário.

A implementação dessa navegação segue o padrão das anteriores.

import { createBottomTabNavigator, createAppContainer } from 'react-navigation';

import Login from '../pages/Login';
import Dashboard from '../pages/Dashboard';

const mainNavigation = createBottomTabNavigator({
  Login,
  Dashboard,
});

export default createAppContainer(mainNavigation);

MaterialBottomTabNavigator

Os navigators que contém a palavra material foram construídos com o layout do Material UI, que é uma biblioteca de estilos muito poderosa, feita pelo Google.

Para utilizar esse navigator, também é necessário instalar duas bibliotecas extras, são elas:

react-navigation-material-bottom-tabs
react-native-paper

Para esse exemplo, também foi usada a biblioteca react-native-vector-icons.

import React from 'react';
import { createAppContainer } from 'react-navigation';
import { createMaterialBottomTabNavigator } from 'react-navigation-material-bottom-tabs';
import Icon from 'react-native-vector-icons/FontAwesome';

import Login from '../pages/Login';
import Dashboard from '../pages/Dashboard';

Icon.loadFont();

const mainNavigation = createMaterialBottomTabNavigator(
  {
    Login: {
      screen: Login,
      navigationOptions: () => ({
        tabBarIcon: ({ focused }) => (
          <Icon name="lock" size={20} color={focused ? '#fff' : '#ddd'} />
        ),
      }),
    },
    Dashboard: {
      screen: Dashboard,
      navigationOptions: () => ({
        tabBarIcon: ({ focused }) => (
          <Icon name="rocket" size={20} color={focused ? '#fff' : '#ddd'} />
        ),
      }),
    },
  },
  {
    barStyle: {
      backgroundColor: '#7159c1',
    },
  },
);

export default createAppContainer(mainNavigation);

MaterialTopTabNavigator

Esse é um tipo de navegação em que o menu fica na parte superior da tela, é um tipo de navegação muito interessante para um conjunto de duas ou três rotas.

Esse navigator já implementa a navegação do tipo slide entre telas, e, assim como o navigator anterior, também implementa o design do Material UI.

A implementação desse navigator exige um certo cuidado a mais.

Devido aos novos tipos de StatusBar, como a do iPhone X, é necessário que criemos uma SafeArea para que o menu não cubra a StatusBar do aparelho. Veja como fica:

import React from 'react';
import { SafeAreaView } from 'react-native';

import {
  createMaterialTopTabNavigator,
  createAppContainer,
  MaterialTopTabBar,
} from 'react-navigation';

import Login from '../pages/Login';
import Dashboard from '../pages/Dashboard';

function SafeAreaMaterialTopTabBar(props) {
  return (
    <SafeAreaView>
      <MaterialTopTabBar {...props} />
    </SafeAreaView>
  );
}

const mainNavigation = createMaterialTopTabNavigator(
  {
    Login,
    Dashboard,
  },
  {
    tabBarComponent: SafeAreaMaterialTopTabBar,
    tabBarOptions: {
      tabStyle: {
        backgroundColor: '#7159c1',
      },
    },
  },
);

export default createAppContainer(mainNavigation);

Concluindo

Espero que esse post possa servir como um guia para te ajudar a escolher e implementar o melhor tipo de navegação para o seu aplicativo.

Deixa um comentário sobre o que você achou do post :)

Forte Abraço!