Обещание входа в Firebase не разрешается, пока я не коснусь экрана - PullRequest
1 голос
/ 18 апреля 2019

Я слежу за этим Пройдите курс по Удеми , и я столкнулся с действительно странной ошибкой.

Я использую Firebase для аутентификации по электронной почте и паролю. Когда пользователи нажимают на кнопку «Войти», я отправляю действие LOGIN_USER, которое устанавливает состояние загрузки.

При успешном входе в систему я отправляю действие под названием LOGIN_USER_SUCCESS, чтобы остановить состояние загрузки.

По какой-то причине LOGIN_USER_SUCCESS не произойдет, пока я не коснусь случайного места на экране.

Если я удаляю строку dispatch({ type: LOGIN_USER });, чтобы отключить состояние загрузки, авторизация вернется через пару секунд.

My actions
-----------

export const loginUser = ({ email, password }) => {
  return (dispatch) => {
    dispatch({ type: LOGIN_USER });

    firebase.auth().signInWithEmailAndPassword(email, password)
      .then(user => loginUserSuccess(dispatch, user))
      .catch((error) => {
        console.log(error);

        firebase.auth().createUserWithEmailAndPassword(email, password)
          .then(user => loginUserSuccess(dispatch, user))
          .catch(() => loginUserFail(dispatch));
      });
  };
};

const loginUserSuccess = (dispatch, user) => {
  dispatch({
    type: LOGIN_USER_SUCCESS,
    payload: user
  });
};


const INITIAL_STATE = {
  email: '',
  password: '',
  user: null,
  error: '',
  loading: false
};


/// My reducer
---------------

export default (state = INITIAL_STATE, action) => {
  switch (action.type) {
    case EMAIL_CHANGED:
      return { ...state, email: action.payload };
    case PASSWORD_CHANGED:
      return { ...state, password: action.payload };
    case LOGIN_USER:
      return { ...state, loading: true, error: '' };
    case LOGIN_USER_SUCCESS:
      return { ...state, ...INITIAL_STATE, user: action.payload };
    case LOGIN_USER_FAIL:
      return { ...state, error: 'Authentication Failed.', password: '', loading: false };
    default:
      return state;
  }
};

Я попытался .then(user => console.log(user)), и я не вижу журнал консоли до тех пор, пока случайно не коснусь в любом месте экрана.

Если я сделаю .then(console.log('foo'), я сразу же увижу foo, но экран все еще зависает.

Как я уже говорил, я следую учебному пособию, а полный источник - здесь, на GitHub . Я в основном получил точно такой же код.

1 Ответ

0 голосов
/ 18 апреля 2019

У меня была такая же проблема. Кажется, что некоторые функции Firebase не работают должным образом в симуляторе или эмуляторе. Я попытался запустить свое приложение на устройстве iphone, и оно работает просто отлично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...