1. Para fazermos esse exercício, iremos criar um novo projeto. Pois dessa forma não iremos atrapalhar o nosso projeto no que já existe.

  2. Vamos então na área de trabalho abrir o terminal (Ou crie o projeto expo de acordo com seu sistema operacional) e então iremos dar o comando de criação. Podemos chamar o projeto de “tab-navigation”

    npx create-expo-app --template
    
  3. E iremos escolher o template “Black (Bare)”, pois é o que estamos utilizando nos exemplos principais. E aí ao finalizar a criação do projeto, iremos fazer a instalação da lib.

    npm install @react-navigation/native
    
    npm install @react-navigation/bottom-tabs
    
  4. Nós iremos seguindo o que temos na documentação, porém na documentação é feito tudo em uma única página, faremos em páginas separadas.

  5. Vamos criar uma pasta “src” e dentro dela uma “pages”. “Src → Pages”

  6. Agora, dentro da pasta “Pages” iremos criar duas novas, para termos duas páginas no exercício. Faremos uma pasta chamada “Home” e outra chamada “Settings”, com um “index.jsx” dentro de cada uma.

    1. “Src → Pages → Home → index.jsx”
    2. “Src → Pages → Settings → index.jsx”
  7. Agora, iremos criar os arquivos de fato, a parte de dentro deles. Podemos começar pela nossa “Home”. Vamos criar algo bem padrão, apenas para vermos a diferença da navegação. “Src → Pages → Home → index.jsx”

    import React from "react";
    import { View, Text, StyleSheet } from "react-native";
    
    export default function Home() {
      return (
        <View style={styles.container}>
          <Text>Página home aqui!</Text>
        </View>
      );
    }
    
    const styles = StyleSheet.create({
      container: {
    		flex: 1,
        justifyContent: "center",
        alignItems: "center",
      },
    });
    
  8. Agora, faremos a mesma página no “settings”. “Src → Pages → Settings → index.jsx”

    import React from "react";
    import { View, Text, StyleSheet } from "react-native";
    
    export default function Settings() {
      return (
        <View style={styles.container}>
          <Text>Página settings aqui!</Text>
        </View>
      );
    }
    
    const styles = StyleSheet.create({
      container: {
    		flex: 1,
        justifyContent: "center",
        alignItems: "center",
      },
    });
    
  9. Ao criarmos esses arquivos, podemos também criar o arquivo que ficará responsável pelas rotas. Iremos criar dentro de “Src” uma pasta “Routes”, e dentro dela um “index.jsx”. “Src → Routes → index.jsx”

  10. Agora, iremos trabalhar primeiro no arquivo dentro de “Routes”. Iremos importar o container e também o “createBottomTabNavigator”, de forma muito parecida com o nosso stack, mudando apenas de fato a variação.

    import { NavigationContainer } from "@react-navigation/native";
    import { createBottomTabNavigator } from "@react-navigation/bottom-tabs";
    
    const Tab = createBottomTabNavigator();
    
  11. Agora, nós iremos montar o restante da função.

    import { NavigationContainer } from "@react-navigation/native";
    import { createBottomTabNavigator } from "@react-navigation/bottom-tabs";
    
    const Tab = createBottomTabNavigator();
    
    export default function Routes() {
      return (
        <NavigationContainer>
          <Tab.Navigator>
          </Tab.Navigator>
        </NavigationContainer>
      );
    }
    
  12. Agora, vamos importar as páginas e utilizar elas aqui dentro do “Tab.Navigator”

    import { NavigationContainer } from "@react-navigation/native";
    import { createBottomTabNavigator } from "@react-navigation/bottom-tabs";
    
    import Home from "../Pages/Home";
    import Settings from "../Pages/Settings";
    
    const Tab = createBottomTabNavigator();
    
    export default function Routes() {
      return (
        <NavigationContainer>
          <Tab.Navigator>
            <Tab.Screen name="Home" component={Home} />
            <Tab.Screen name="Settings" component={Settings} />
          </Tab.Navigator>
        </NavigationContainer>
      );
    }
    
  13. Depois de tudo isso feito, temos a estrutura. Vamos para o arquivo “App.js”, pois ele é o principal arquivo do app. Nele iremos fazer o padrão, excluir tudo dentro do return e de estilo, para colocar apenas o nosso “Routes”.

    import React from "react";
    import Routes from "./Src/Routes";
    
    export default function App() {
      return <Routes />;
    }
    
  14. Podemos então testar o nosso app para verificar a nossa navegação implementada. Podemos ver que no teste temos as barras de baixo setadas, e também uma barra acima, com o nome da página. Ao mudar de página, mudamos o nome de cima também.

  15. Vamos então remover esse nosso nome de cima, do “screenOptions”. “Src → Routes → index.jsx”

    export default function Routes() {
      return (
        <NavigationContainer>
          <Tab.Navigator screenOptions={{ headerShown: false }}>
            <Tab.Screen name="Home" component={Home} />
            <Tab.Screen name="Settings" component={Settings} />
          </Tab.Navigator>
        </NavigationContainer>
      );
    }
    
  16. Ao fazermos isso retiramos o nome da tela no topo da nossa página. E se quisermos também fazer a adição de ícones nos botões de tab, nós podemos facilmente.

  17. Vamos fazer a adição de ícones do próprio expo, porém se você quiser colocar alguma imagem, basta substituir o uso dos ícones por “require(”caminho-da-imagem”)”, e você irá pegar a imagem.

  18. Vamos começar excluindo o nosso “headerShown”, pois vamos colocar uma função aqui dentro para que ele faça uma verificação, colocando itens no local correto.

    export default function Routes() {
      return (
        <NavigationContainer>
          <Tab.Navigator screenOptions={}>
            <Tab.Screen name="Home" component={Home} />
            <Tab.Screen name="Settings" component={Settings} />
          </Tab.Navigator>
        </NavigationContainer>
      );
    }
    
  19. Agora, iremos criar uma função aqui, recebendo como parâmetro o “route”, pois precisamos pegar em qual página estamos.

    export default function Routes() {
      return (
        <NavigationContainer>
          <Tab.Navigator screenOptions={({ route }) => ({})}>
            <Tab.Screen name="Home" component={Home} />
            <Tab.Screen name="Settings" component={Settings} />
          </Tab.Navigator>
        </NavigationContainer>
      );
    }