Как исправить ошибку undefined is not an object?

Ошибка вывода такая:

TypeError: TypeError: undefined is not an object (evaluating '_this.state.userInfo.picture.data')

там я просто хочу передать данные из facebook в свой вид в реакции native. там написано undefined is not an object, как это исправить?

Вот код компонента HomeScreen:

import React, { Component } from 'react';
import { Text, TouchableOpacity, ScrollView, View, StyleSheet, Button, Alert, Image } from 'react-native';
import Expo, { Constants } from 'expo';

export default class HomeScreen extends Component {

    constructor(props){
        super(props);
        this.state = { userInfo: null }
    }

    async logInFB() {
        try {
          const {
            type,
            token,
            expires,
            permissions,
            declinedPermissions,
          } = await Expo.Facebook.logInWithReadPermissionsAsync('214751749451960', {
            permissions: ['public_profile'],
          });
          if (type === 'success') {
            // Get the user's name using Facebook's Graph API
            const response = await fetch(`https://graph.facebook.com/me?access_token=${token}&fields=id.name.picture.type(large)`);
            const userInfo = await response.json();
            this.setState({ userInfo });
            Alert.alert('Logged in!', `Hi ${(await response.json()).name}!`);
          } else {
            // type === 'cancel'
          }
        } catch ({ message }) {
          alert(`Facebook Login Error: ${message}`);
        }
    }

    _renderUserInfo = () => {
        return(
            <View style = {{ alignItems:'center' }}>
                <Image
                    source = {{ uri: this.state.userInfo.picture.data.url}}
                    style = {{width:100, height:100, borderRadius:50}}
                />
                <Text style = {{ fontSize:20 }}>
                    { this.state.userInfo.name }
                </Text>
                <Text>ID: { this.state.userInfo.id }</Text>
            </View>
        );
    }


    render(){
        return(
            <View style = {styles.container}>
                <Text>welcome to my apps!</Text>
                { !this.state.userInfo ? (<Button title = "Connect with facebook" onPress = {this.logInFB.bind(this)}/>) : (this._renderUserInfo())}
            </View>
        );
    }
}

Вот стиль (они оба в одном файле):


const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    paddingTop: Constants.statusBarHeight,
    backgroundColor: '#ecf0f1',
  },
  paragraph: {
    margin: 24,
    fontSize: 18,
    fontWeight: 'bold',
    textAlign: 'center',
    color: '#34495e',
  },
});

Заранее спасибо :)

Я уже использую этот .bind в своем событии buttonevent, но все еще не работает для меня, onPress = {this.logInFB.bind (this)}

Jhony Rainn id 24.12.2018 02:47

Попробуйте зарегистрировать объект userInfo и проверить, есть ли у него свойство под названием «изображение». Возможно, Facebook не предоставляет вам это свойство, если у пользователя нет изображения.

ack_inc 24.12.2018 03:02

пожалуйста, помогите .. вверх

Jhony Rainn id 24.12.2018 04:24
Умерло ли Create-React-App?
Умерло ли Create-React-App?
В этом документальном фильме React.dev мы исследуем, мертв ли Create React App (CRA) и какое будущее ждет этот популярный фреймворк React.
Освоение React Native: Пошаговое руководство для начинающих
Освоение React Native: Пошаговое руководство для начинающих
React Native - это популярный фреймворк с открытым исходным кодом, используемый для разработки мобильных приложений. Он был разработан компанией...
В чем разница между react native и react ?
В чем разница между react native и react ?
React и React Native - два популярных фреймворка для создания пользовательских интерфейсов, но они предназначены для разных платформ. React - это...
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
Если вы уже умеете работать с React, создание мобильных приложений для iOS и Android - это новое приключение, в котором вы сможете применить свои...
Хуки React: что это такое и как их использовать
Хуки React: что это такое и как их использовать
Хуки React - это мощная функция библиотеки React, которая позволяет разработчикам использовать состояние и другие возможности React без написания...
1
3
5 322
4

Ответы 4

Попробуйте объявить свой userInfo в своем состоянии таким образом.

constructor(props){
        super(props);
        this.state = { userInfo:{} }
    }

Возможно, ваш "this.state.userInfo" в этой строке

source = {{ uri: this.state.userInfo.picture.data.url}}

по-прежнему имеет значение null, следовательно, null.picture.data.url, где null не является объектом.

Вместо

import Expo, { Constants } from 'expo';

Пытаться

import { Facebook, Constants } from 'expo';

Затем измените

await Expo.Facebook.logInWithReadPermissionsAsync

к

await Facebook.logInWithReadPermissionsAsync

см. https://forums.expo.io/t/import-expo-from-expo-has-been-deprecated/15799

Из кода очень ясно, что при обходе цепочки this.state.userInfo.picture.data.urlundefined находится где-то посередине.

Я не даю точного решения, но предлагаю избежать этого типа ошибок, известного как исключения нулевого указателя.

Пожалуйста, используйте какую-нибудь простую утилитарную библиотеку, например idx, для просмотра свойств объектов.

// Using regular JavaScript 

getSourceURL = () => {
  if ( this 
    && this.state 
    && this.state.userInfo 
    && this.state.userInfo.picture 
    && this.state.userInfo.picture.data 
    && this.state.userInfo.picture.data.url) {
    return this.state.userInfo.picture.data.url;
  } 
}

Вы можете добиться того же, используя idx, как показано ниже

// Using idx 

getSourceURL = () => {
  if ( idx(this, _ => _.state.userInfo.picture.data.url )) {
    return this.state.userInfo.picture.data.url;
  }
}

плюс 1 введение idx.

Aman Gupta 09.08.2019 15:07

В любом случае старайтесь не устанавливать состояние на null! Вы можете инициализировать так:

 userInfo : {
    picture: { }
 }

В соответствии с жизненными циклами компонентов конструктор будет выполнен первым. Ваша задача асинхронная, поэтому состояние будет оставаться нулевой до тех пор, пока данные не будут получены с сервера.

Другие вопросы по теме