Firebase onAuthStateChanged取消订阅不是函数错误

时间:2018-01-12 16:54:46

标签: firebase react-native firebase-authentication react-navigation react-native-firebase

首次安装时,app运行没有任何问题。

  1. 在启动画面检查登录状态。
  2. 用户未登录,导航至登录界面。
  3. 但是当应用最小化然后重新打开时,unsubscribe() is not a function错误会显示并停留在初始屏幕上。这只发生在最小化>从全新安装和首次运行中恢复。

    这意味着如果我从后台杀了应用程序并打开然后最小化然后恢复,它完全正常。

    这是我在firebase文档中使用的checkLoginState函数。我不确定这与react-nativefirebasereact-native-firebasereact-navigation有关。知道如何调试和解决这个问题吗?

    Handle the sign-in flow manually

    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重新加载app我在日志中得到了这个。 componentDidmount和unmount多次运行。每个最小化>恢复堆栈1.如果我杀了app并重新打开,这个问题就消失了。请注意,这在物理和虚拟设备中都会发生。

    enter image description here

    更新1

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

1 个答案:

答案 0 :(得分:-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();

  }
});