firebase.auth().onAuthStateChanged() возвращает неопределенное значение в react native

#reactjs #firebase #react-native #firebase-authentication

#reactjs #firebase #react-native #firebase-аутентификация

Вопрос:

Я пытаюсь получить статус авторизации после обновления приложения и предыдущего входа в систему, но firebase.auth().onAuthStateChanged() выдает undefined. Причиной этого является либо переход к главному экрану, либо к экрану входа, используя статус авторизации.

 import React, {Component} from 'react';
import {View} from 'react-native';
import firebase from 'firebase';
import {connect} from 'react-redux';
import {Spinner} from '../components/common';

class Switch extends Component {

  componentDidMount() {
    const userData = this.checkUser();
    this.switchContent(userData);
  }
  checkUser = () => {
    firebase.auth().onAuthStateChanged(async (userData) => {
      return userData;
    });
  };
  switchContent(userData) {
    console.log(userData);
    if (userData) {
      return this.props.persistantSignIn();
    }
    return this.props.navigation.push('SignInForm');
  }
  renderComponent() {
    return (
      <View style={{flex: 1}}>
        <Spinner />
      </View>
  }
  render() {
    return <View style={{flex:1}}>{this.renderComponent()}</View>;
  }
}

export default connect(null, {persistantSignIn})(Switch);
  

Ответ №1:

Результаты onAuthStateChanged (т.е. userData ) должны обрабатываться в анонимной функции. Также обратите внимание, что до тех пор, пока пользователь не войдет в систему, userData будет null .

   componentDidMount() {
    firebase.auth().onAuthStateChanged( (userData) => {
      this.switchContent(userData);
    });
  }
  

Нет необходимости переносить firebase.auth().onAuthStateChanged внутри анонимной функции, если, например, вы не должны были использовать useEffect , например, следующее:

 import { useEffect } from 'react';

...
  useEffect(() => {
    auth.onAuthStateChanged( userData => {
      this.switchContent(userData);
    })
  },[])