1. Nós vamos começar criando uma pasta dentro de “components” chamada “Error” e dentro dela vamos criar uma chamada “ErrorScreen”

  2. Vamos criar dentro de “ErrorScreen” o index e o styled. Vamos começar criando a estrutura visual da tela, que será apenas um container e um título de erro

    import styled from "styled-components/native";
    
    export const Container = styled.View`
      flex: 1;
      background-color: #222323;
    `;
    
    export const ErrorTitle = styled.Text`
      font-size: 28px;
      font-weight: bold;
      text-align: center;
      color: white;
      margin-top: 40px;
    `;
    
  3. Agora iremos apenas puxar as informações visuais do styled e usar aqui no index.

    import React from "react";
    import { Container, Title } from "./styled";
    
    const ErrorScreen = () => {
      return (
        <Container>
          <Title>Está tela teve algum erro</Title>
        </Container>
      );
    };
    
    export default ErrorScreen;
    
  4. Com isso feito, já temos a tela pronta, vamos usar ela dentro de error, porém nesse arquivo nós vamos criar o componente de classe, pois é necessário isso para poder criar o ErrorBoundary

  5. O ErrorBoundary no React é um componente utilizado para capturar e tratar erros durante a renderização de outros componentes.

  6. Vamos começar criando a estruta de classe para renderizar, criando também duas interfaces de tipos

    import React, { Component, ReactNode } from "react";
    
    interface Props {
      children: ReactNode;
    }
    
    interface State {
      hasError: boolean;
    }
    
    class ErrorBoundary extends Component<Props, State> {}
    
    export default ErrorBoundary;
    
  7. Agora nós iremos criar o constructor, para que o state inicial de ter erro comece como falso

    import React, { Component, ReactNode } from "react";
    
    interface Props {
      children: ReactNode;
    }
    
    interface State {
      hasError: boolean;
    }
    
    class ErrorBoundary extends Component<Props, State> {
    	constructor(props: Props) {
        super(props);
        this.state = { hasError: false };
      }
    }
    
    export default ErrorBoundary;
    
  8. Nós vamos criar o componentDidCatch, para caso o componente pegue um erro, ele exiba. E aí nós vamos exibir no console uma mensagem para o programador checar.

    import React, { Component, ReactNode } from "react";
    
    interface Props {
      children: ReactNode;
    }
    
    interface State {
      hasError: boolean;
    }
    
    class ErrorBoundary extends Component<Props, State> {
    	constructor(props: Props) {
        super(props);
        this.state = { hasError: false };
      }
    
    	componentDidCatch(error: Error, errorInfo: ErrorInfo) {
        console.log("Erro capturado pela ErrorBoundary:", error, errorInfo);
      }
    }
    
    export default ErrorBoundary;
    
  9. E por fim, nós vamos criar o render, que irá mostrar o screen que a gente criou na tela

    import React, { Component, ReactNode } from "react";
    
    interface Props {
      children: ReactNode;
    }
    
    interface State {
      hasError: boolean;
    }
    
    class ErrorBoundary extends Component<Props, State> {
    	constructor(props: Props) {
        super(props);
        this.state = { hasError: false };
      }
    
    	componentDidCatch(error: Error, errorInfo: ErrorInfo) {
        console.log("Erro capturado pela ErrorBoundary:", error, errorInfo);
      }
    
    	render() {
        if (this.state.hasError) {
          return <ErrorScreen />;
        }
    
        return this.props.children;
      }
    }
    
    export default ErrorBoundary;
    
  10. Agora para ele capturar o nosso erro, ele vai envolver todo o App, indo para o App.tsx

    export default function App() {
      return (
        <ErrorBoundary>
          <StatusBar style="light" />
          <ThemeProvider theme={myTheme}>
            <Routes />
          </ThemeProvider>
        </ErrorBoundary>
      );
    }