Я пытаюсь реализовать функцию подписки с помощью Facebook для моего приложения-носителя, и я застрял на этом этапе, когда данные успешно извлекаются из профиля, и я проверил их на экране предупреждения.Вот мой код, в котором я вызываю функцию другого компонента (FBLogin). Прежде всего, есть Touchable Opacity (пользовательский интерфейс для кнопки входа в Facebook)
<TouchableOpacity // This is in the Main Screen
onPress={() => {
this.goFacbookLogin()
}}
</TouchableOpacity>
Вот моя функция, которая вызываетсяна мероприятии onPress.
async goFacbookLogin(){ // This is also a function on the Main Screen
await FBLogin.facebookLogin().then((data) =>{
alert("Data: " + JSON.stringify(data));
});
}
Теперь FBLogin - это в основном сервис для входа на Facebook.и у него есть функция facbookLogin ()
import React, { Component } from 'react';
import { View, Button, Dimensions } from 'react-native';
import {LoginManager, LoginButton,
AccessToken,GraphRequest,GraphRequestManager } from 'react-native-fbsdk';
class FBLoginButton extends Component{// This is Implemented in another File
constructor(props)
{
super(props);
this.state =
{
//screenWidth: Dimensions.get("window").width,
//screenHeight: Dimensions.get("window").height,
UserProfileInformation:
{
UserAge: null,
Gender: null,
UserLocation: null,
ImageUrl: null,
}
}
}
async facebookLogin()
{
let _result;
try
{
LoginManager.setLoginBehavior('NATIVE_ONLY');
_result = await LoginManager.logInWithReadPermissions(['public_profile',
"email","user_birthday", "user_gender","user_hometown"]);
console.warn("Done");
}
catch (nativeError)
{
try
{
LoginManager.setLoginBehavior('WEB_ONLY');
_result = await LoginManager.logInWithReadPermissions(['public_profile',
"email", "user_birthday", "user_gender", "user_hometown"]);
}
catch (webError)
{
alert("Function Called Web Error");
}
}
if (_result.isCancelled)
{
alert('Login Cancel')
}
else
{
global.res1 = "None";
const data = await AccessToken.getCurrentAccessToken();
const infoRequest = new GraphRequest
(
'/me',
{
accessToken: data.accessToken,
parameters:
{
fields:
{
string: 'first_name, name, gender, birthday, email, hometown'
}
}
},
(error, result) => {
if (error)
{
alert("error: " + JSON.stringify(error));
}
else
{
let UserProfileInformation = this.state.UserProfileInformation;
UserProfileInformation['Gender'] = result.gender;
UserProfileInformation['UserLocation'] = result.hometown.name;
this.setState({ UserProfileInformation: UserProfileInformation}, ()
=> console.warn("DDDDD: " + this.state.UserProfileInformation));
res1 = result;
}
}
);
new GraphRequestManager().addRequest(infoRequest).start()
return(this.state.UserProfileInformation);
}
//return "Done";
}
}
export default FBLogin = new FBLoginButton();
Теперь проблема в том, что когда Graph Request запускает InfoRequest, он успешно выбирает данные в функции обратного вызова, но я понятия не имею, как вернуть его на главнуювызов функции, в которой я реализовал оператор затем после вызова функции.В настоящее время данные хранятся в состоянии, но, поскольку состояние требует времени для изменения оператора возврата, выполненного досрочно, и я получил значение NULL, но когда я нажимаю кнопку непрозрачности во второй раз, данные верны, так как было изменено предыдущее состояние.Я попробовал глобальные и пустые переменные, но они были уничтожены после завершения функции обратного вызова.
Короче говоря, все, что я хочу, это вернуть этот результат в facebookLogin на главном экране.
Я новичок в React Native, так что если кто-то может помочь, это будет действительно оценено.