Ошибка типа: неопределенный не является объектом (вычисление ‘_useContext.dispatch’) при использовании контекста в react native

#javascript #reactjs #react-native #react-native-android #use-context

#javascript #reactjs #react-native #use-context

Вопрос:

Я просто следую инструкциям из курса react native, и когда я использую контекст для обработки входа, я получил эту ошибку: введите описание изображения здесь

Я просмотрел код, и он равен коду инструктора. Код приведен ниже:

src/signIn/index.js

 import React, {useState, useContext} from 'react';
import {useNavigation} from '@react-navigation/native';
import AsyncStorage from '@react-native-community/async-storage';
import { UserContext } from '../../contexts/UserContext';
import {
    Container,
    InputArea,
    CustomButton,
    CustomButtonText,
    SignMessageButton,
    SignMessageButtonText,
    SignMessageButtonTextBold,
} from './styles';

import Api from '../../Api';

import SignInput from '../../components/SignInput';

import BarberLogo from '../../assets/barber.svg';
import EmailIcon from '../../assets/email.svg';
import LockIcon from '../../assets/lock.svg';

export default () => {
    const {dispatch: userDispatch} = useContext(UserContext);
    const navigation = useNavigation();

    const [emailField, setEmailField] = useState('');
    const [passwordField, setPasswordField] = useState('');

    const handleSignCLick = async () => {
        if (emailField != '' amp;amp; passwordField != '') {
            let json = await Api.signIn(emailField, passwordField);

            if (json.token) {
                alert('WORKS!!');
                
                await AsyncStorage.setItem('token', json.token);

                userDispatch({
                    type: 'setAvatar',
                    payload: {
                        avatar: json.data.avatar
                    }
                });

                navigation.reset({
                    routes:[{name:'Maintab'}]

                });

            } else {
                alert('Wrong email or password!');
            }
        } else {
            alert('Fill in the form');
        }
    };

    const handleMessageButtonClick = () => {
        navigation.reset({
            routes: [{name: 'SignUp'}],
        });
    };

    return (
        <Container>
            <BarberLogo width="100%" height="160" />

            <InputArea>
                <SignInput
                    placeholder="Type your email"
                    IconSvg={EmailIcon}
                    value={emailField}
                    onChangeText={(t) => setEmailField(t)}
                />
                <SignInput
                    placeholder="Type your password"
                    IconSvg={LockIcon}
                    value={passwordField}
                    onChangeText={(t) => setPasswordField(t)}
                    password={true}
                />

                <CustomButton onPress={handleSignCLick}>
                    <CustomButtonText>LOGIN</CustomButtonText>
                </CustomButton>
            </InputArea>

            <SignMessageButton onPress={handleMessageButtonClick}>
                <SignMessageButtonText>
                    Does not have an account?
                </SignMessageButtonText>
                <SignMessageButtonTextBold>
                    Sing up
                </SignMessageButtonTextBold>
            </SignMessageButton>
        </Container>
    );
};
  

Когда я комментирую эти строки ниже, приложение возвращается к функционированию:

 if (json.token) {
    alert('WORKS!!');
    
    // await AsyncStorage.setItem('token', json.token);

    // userDispatch({
    //     type: 'setAvatar',
    //     payload: {
    //         avatar: json.data.avatar
    //     }
    // });

    // navigation.reset({
    //     routes:[{name:'Maintab'}]

    // });

} else {
    alert('Wrong email or password!');
}
  

src/contexts/UserContext.js

 import React, {createContext, useReducer} from 'react';
import {initialState, UserReducer} from '../reducers/UserReducer';

export const UserContext = createContext();

export default ({children}) => {
    const [state, dispatch] = useReducer(UserReducer, initialState);

    return (
        <UserContext.Provider valule={{state, dispatch}}>
            {children}
        </UserContext.Provider>
    );
};
  

Я новичок в контексте react native, так что я что-то упускаю?

Комментарии:

1. Разве это не должно быть value вместо valule вашего UserContext ? Также вы перенесли свой UserContext в свой файл приложения?