DEV Community

Lucas Cruz
Lucas Cruz

Posted on

Tornado variáveis globais em react-native com context.

Ao fim do artigo você saberá como usar Context em seu app react-native para fazer com que suas variáveis/estados sejam globais, ou seja, acessíveis de todas as telas.

Problema

Eu estou desenvolvendo um app que usa dados locais e os armazena em SQLite e preciso que após buscar esses dados eles estejam disponíveis em várias telas. Além disso é necessário que após atualizar o banco eu consiga atualizar os dados disponíveis em todas as telas.

Criando um context e um provider.

Primeiro eu crio uma pasta para os contexts, nesse caso vai ser apenas um, chamada 'contexts', após isso o arquivo que será declarado o context e o provider, como os dados que eu quero que sejam globais são dados do banco de dados local, chamei o arquivo de Data.jsx ficando:

src/contexts/Data.jsx

do heact eu importo a função 'createContext'

Um básico ficaria assim:

import { useState, createContext} from "react";

export const dataContext = createContext({})

function DataProvider({children}){
    const [item, setItem] = useState([])
    return(
        <dataContext.Provider value={{ item }}>
            {children}
        </dataContext.Provider>
        )
}

export default DataProvider;
Enter fullscreen mode Exit fullscreen mode

Assim todas as telas conseguirão acessar o state 'item', vou mostrar o meu exemplo real aqui:

import { useState, createContext, useEffect} from "react";
import { getSubjects } from "../storage/subjectRepository";
import { initDB } from "../storage/db";

export const dataContext = createContext({})

function DataProvider({children}){
    const [listSubject, setListSubject] = useState([])
    useEffect(()=>{
        // Inicializa o banco de dados criando as tabelas
        initDB()

        // Busca as disciplinas no banco de dados depois um tempo
        // para dar tempo das tabelas serem criadas se for a primeira
        // vez que o user abre o app
        setTimeout(()=>{
            getSubjects( subjects => {
                //Define o estado de listSubject o resultado da consulta
                setListSubject(subjects)
                console.log("my subjects:", subjects)
            })
        }, 500)  

    },[])

    return(
        <dataContext.Provider value={{ listSubject, setListSubject }}>
            {children}
        </dataContext.Provider>
        )
}

export default DataProvider;
Enter fullscreen mode Exit fullscreen mode

Nessa forma é possível tornar disponível para todas as telas os dados do banco de dados.

return(
    <dataContext.Provider value={{ listSubject, setListSubject }}>
            {children}
    </dataContext.Provider>
)
Enter fullscreen mode Exit fullscreen mode

É Importante destacar que nessa parte que são passados os dados que estarão disponíveis, estes dentro do objeto em value.

Encapsulamento de contexto

Para o provider funcionar é necessário fazer um "encapsulamento" dos componentes de tela com o provider

export default function App(){
    return(
    <NavigationContainer>
      <DataProvider>
        <MyTabs></MyTabs>
      </DataProvider>
    </NavigationContainer>
    )
}
Enter fullscreen mode Exit fullscreen mode

Dessa forma todos os componentes que estiverem encapsulados pelo provider poderão consumir os dados passados, no exemplo acima todas as telas estão em assim todas elas têm acesso aos dados.

Consumo de contexto

Para consumir esses dados do contexto é necessário importar o useContext e o contexto criado.

import { useContext } from "react"
import { dataContext } from "../../contexts/Data"

Enter fullscreen mode Exit fullscreen mode

E dentro do componente que se deseja consumir esse contexto, usa-se a desestruturação para pegar apenas as variáveis que se deseja:

const {listSubject, setListSubject} = useContext(dataContext)
Enter fullscreen mode Exit fullscreen mode

Dessa forma, com states dentro de um componente podemos usar a função set do useState para modificar o valor o state e também usar esse valor para exibir na tela ou fazer qualquer manipulação.

Assim é possível tornar globais variáveis e states.

Referências

Sujeito Programador - Entender Context API
https://react.dev/reference/react/createContext
https://react.dev/reference/react/useContext

Top comments (0)