在我点击屏幕上的任意位置之前,Firebase 登录承诺不会解决

Posted

技术标签:

【中文标题】在我点击屏幕上的任意位置之前,Firebase 登录承诺不会解决【英文标题】:Firebase login promise doesn't resolve until I tap anywhere on the screen 【发布时间】:2019-09-08 15:04:40 【问题描述】:

我正在关注这个React course on Udemy,但遇到了一个非常奇怪的错误。

我正在使用 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,但屏幕仍然挂起。

正如我所提到的,我正在学习一个教程,完整的源代码是 here on GitHub。我基本上得到了完全相同的代码。

【问题讨论】:

我也在关注他的一门 Udemy 课程,但遇到了同样的问题。你找到解决办法了吗? 我只是忽略了这个问题,因为它似乎是一个模拟器问题。也就是说,使用更新版本的 Xcode,我在 Xcode 中构建了我的项目(而不是命令行中的 react-native run-ios),它打开了另一个没有这个问题的模拟器。 【参考方案1】:

我有同样的问题。似乎某些 firebase 功能在模拟器或模拟器中无法正常工作。我尝试在 iphone 设备上运行我的应用程序,它工作得很好。

【讨论】:

【参考方案2】:

在 firebase 中登录用户的推荐方法是注册一个回调到 firebase.auth().onAuthStateChanged(call_back) 。您可以从此回调中调度您的操作

【讨论】:

以上是关于在我点击屏幕上的任意位置之前,Firebase 登录承诺不会解决的主要内容,如果未能解决你的问题,请参考以下文章

当用户点击屏幕上的任意位置时调用函数

如何使用点击事件使其不会传播到视图

如何阻止Firebase用户登录到错误的登录屏幕

如何防止点击屏幕上的某个区域

单击屏幕上的任意位置关闭所有 Angular JS Bootstrap 弹出窗口?

python 如何实现运行后单击屏幕的任意位置返回鼠标点击坐标的位置?