No meu aplicativo React Native, estou tendo um problema em que a função setState não está sendo reconhecida como uma função.
Já inseri o provedor de contexto na página raiz do aplicativo e exportei as propriedades de contexto, mas ainda não funciona.
Estou tentando chamá-lo em um componente e ainda recebo a mensagem "setAppCompany não é uma função".
Aplicativo.js
import React from 'react';
import { NavigationContainer } from '@react-navigation/native';
import AppProviders from './mobile/src/providers/AppProviders';
import Route from './mobile/src/navigations/Route';
import Layout from './mobile/src/layout/Layout';
export default function App() {
return (
<AppProviders>
<NavigationContainer>
<Layout>
<Route />
</Layout>
</NavigationContainer>
</AppProviders>
);
}
AppProviders.js
import React from 'react';
import CompanyProvider from '../contexts/CompanyContext';
import UserProvider from '../contexts/UserContext';
const AppProviders = ({ children }) => {
return (
<CompanyProvider>
<UserProvider>{children}</UserProvider>
</CompanyProvider>
);
};
export default AppProviders;
CompanyContext.js
import React, { createContext, useState, useContext } from 'react';
export const CompanyContext = createContext();
export default function CompanyProvider({ children }) {
const [appCompanyId, setAppCompany] = useState(null);
return (
<CompanyContext.Provider value={(appCompanyId, setAppCompany)}>
{children}
</CompanyContext.Provider>
);
}
export const useCompany = () => {
const context = useContext(CompanyContext);
const { appCompanyId, setAppCompany } = context;
return { appCompanyId, setAppCompany };
}
UserContext.js
import React, { createContext, useState, useContext } from 'react';
export const UserContext = createContext();
export default function UserProvider({ children }) {
const [logged, setLogged] = useState(false);
const [userId, setUserId] = useState(null);
const [token, setToken] = useState('');
const [admin, setAdmin] = useState(false);
return (
<UserContext.Provider
value={
(logged, setLogged, userId, setUserId, token, setToken, admin, setAdmin)
}>
{children}
</UserContext.Provider>
);
}
export function useUser() {
const context = useContext(UserContext);
const {
logged,
setLogged,
userId,
setUserId,
token,
setToken,
admin,
setAdmin,
} = context;
return {
logged,
setLogged,
userId,
setUserId,
token,
setToken,
admin,
setAdmin,
};
}
TopBar.js (Componente que usa propriedades de contexto)
import React, { useState, useEffect } from 'react';
import { View, StyleSheet, Text } from 'react-native';
import { Picker } from '@react-native-picker/picker';
import { getCompaniesByUserId } from '../services/api/company.services';
import { useUser } from '../contexts/UserContext';
import { useCompany } from '../contexts/CompanyContext';
const TopBar = () => {
// Hooks ------------------------------------->
const { userId } = useUser();
const { setAppCompany } = useCompany();
const [selectedCompany, setSelectedCompany] = useState(null);
const [avaliableCompanies, setAvailableCompanies] = useState([
{ idEmpresa: 1, nomeEmpresa: 'Rooftop Bar' },
{ idEmpresa: 2, nomeEmpresa: 'Restaurante Brilhante' },
]);
useEffect(() => {
if (avaliableCompanies == null)
setAvailableCompanies(getCompaniesByUserId(userId));
if (avaliableCompanies != null && selectedCompany == null)
setSelectedCompany(avaliableCompanies[0]);
}, [avaliableCompanies, selectedCompany, userId]);
useEffect(() => {
if (selectedCompany != null) setAppCompany(selectedCompany);
}, [selectedCompany, setAppCompany]);
// JSX ------------------------------------->
return (
<View style={styles.topBar}>
<Text style={styles.title}>RoofStock</Text>
<View style={styles.selectorContainer}>
<Text style={styles.label}>Company:</Text>
<Picker
selectedValue={selectedCompany}
onValueChange={setSelectedCompany}
style={styles.picker}
dropdownIconColor="#fff">
{avaliableCompanies.map((company) => (
<Picker.Item
label={company.nomeEmpresa}
value={company.idEmpresa}
/>
))}
</Picker>
</View>
</View>
);
};
Tentei usar a função setState no contexto criado, mas não consegui. Eu esperava usar a função setState para controlar e gerenciar o estado com base nesses dados no aplicativo.
Emitir
O problema aqui é que você formou incorretamente o valor do contexto:
O código, escrito desta forma, usa o operador vírgula :
setAppCompany
em si é retornado como o valor de contexto inteiro , e os consumidores tentam desestruturar valores de propriedade a partir dele, que são indefinidos e não podem ser chamados como funções.Sugestão de solução
Você deve passar um objeto ou uma matriz de valores.
ou