3

首次安装时,应用程序运行没有任何问题。

  1. 在启动画面检查登录状态。
  2. 用户未登录,导航到登录屏幕。

但是unsubscribe() is not a function当应用程序最小化然后重新打开时,错误显示并卡在启动屏幕上。这只发生在最小化 > 从全新安装和首次运行中恢复。

这意味着如果我从后台杀死应用程序并打开然后最小化然后恢复,它工作得很好。

这是checkLoginState我在 firebase 文档中使用的功能。我不确定这与react-nativeorfirebasereact-native-firebaseor相关react-navigation。知道如何调试和解决这个问题吗?

手动处理登录流程

function checkLoginState(event) {
  if (event.authResponse) {
    // User is signed-in Facebook.
    var unsubscribe = firebase.auth().onAuthStateChanged(function(firebaseUser) {
      unsubscribe();
      // Check if we are already signed-in Firebase with the correct user.
      if (!isUserEqual(event.authResponse, firebaseUser)) {
        // Sign in user.
      } else {
        // User is already signed-in Firebase with the correct user.
      }
   });
  } else {
    // User is signed-out of Facebook.
    firebase.auth().signOut();
  }
}

更新

在全新安装>首次运行>最小化>恢复`中,应用程序看起来像堆栈或什么。如果我使用 react-native reload 重新加载应用程序,我会在日志中得到这个。componentDidmount 和 unmount 运行多次。每个最小化>恢复堆栈1。如果我杀死应用程序并重新打开,这个问题就消失了。请注意,这发生在物理设备和虚拟设备中。

在此处输入图像描述

更新 1

这主要与本机反应有关。https://github.com/facebook/react-native/issues/12562

4

1 回答 1

-1

我也遇到了这个问题,并且对此感到头疼……根据将侦听器作为函数调用的文档必须取消订阅侦听器,但事实并非如此。所以这就是我所做的,希望对你也有帮助..

class Home extends Component {


constructor(props) {
    super(props);
    this.Homelistener = null;
    this.state = {
          // ...
    };


this.Homelistener = firebase.auth().onAuthStateChanged(user => {
  if (user) {

   //do whatever you want here
   // you can unsubscribe from the listener here or do it in 
   //componentwillunmount()

    this.Homelistener = null; // --> just set it to null

  } else {

    //do something

    SplashScreen.hide();

  }
});
于 2018-01-20T10:18:11.847 回答