Ошибка вывода такая:
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',
},
});
Заранее спасибо :)
Попробуйте зарегистрировать объект userInfo и проверить, есть ли у него свойство под названием «изображение». Возможно, Facebook не предоставляет вам это свойство, если у пользователя нет изображения.
пожалуйста, помогите .. вверх





Попробуйте объявить свой 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.
В любом случае старайтесь не устанавливать состояние на null! Вы можете инициализировать так:
userInfo : {
picture: { }
}
В соответствии с жизненными циклами компонентов конструктор будет выполнен первым. Ваша задача асинхронная, поэтому состояние будет оставаться нулевой до тех пор, пока данные не будут получены с сервера.
Я уже использую этот .bind в своем событии buttonevent, но все еще не работает для меня, onPress = {this.logInFB.bind (this)}