在React Native App中,React Navigation无法与Firebase一起使用

时间:2020-03-21 16:55:47

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

我有一个有趣的问题。

当我按下注册按钮时,以下功能在SignUp组件中调用。

//SignUp.js
signUpHandler = () => {
        if (this.state.email == '' || this.state.password == '') {
            alert("Email or Password is empty.")
        }
        else {
            firebase.auth().createUserWithEmailAndPassword(this.state.email, this.state.password)
                .then(() => this.props.navigation.navigate('ExtendedRegisteration'))
                .catch(error => { alert(error.message) });
        }
    }

现在,它不会导航到“ ExtendedRegisteration”,但是当我执行以下操作时,它就可以正常导航。

//SignUp.js
signUpHandler = () => {
        if (this.state.email == '' || this.state.password == '') {
            alert("Email or Password is empty.")
        }
        else {
                this.props.navigation.navigate('ExtendedRegisteration')
        }
    }

这是Firebase的问题吗? 使用Firebase注册后,我需要导航至“ ExtendedRegisteration”。

signupHandler中this.props的输出:

Object {
  "navigation": Object {
    "addListener": [Function addListener],
    "canGoBack": [Function canGoBack],
    "dangerouslyGetParent": [Function dangerouslyGetParent],
    "dangerouslyGetState": [Function anonymous],
    "dispatch": [Function dispatch],
    "goBack": [Function anonymous],
    "isFocused": [Function isFocused],
    "jumpTo": [Function anonymous],
    "navigate": [Function anonymous],
    "pop": [Function anonymous],
    "popToTop": [Function anonymous],
    "push": [Function anonymous],
    "removeListener": [Function removeListener],
    "replace": [Function anonymous],
    "reset": [Function anonymous],
    "setOptions": [Function setOptions],
    "setParams": [Function anonymous],
  },
  "route": Object {
    "key": "Sign Up-q-zIoH0VCp",
    "name": "Sign Up",
    "params": undefined,
  },
}

4 个答案:

答案 0 :(得分:1)

这不是 Firebase 的问题。您遇到的问题是从承诺返回后执行的箭头函数中访问导航引用。 this 的作用域与该箭头函数内的作用域不同。

为了避免像 React Navigation has a solution 这样的情况,您可以定义一个函数来直接调用导航。

import { createNavigationContainerRef } from '@react-navigation/native';

export const navigationRef = createNavigationContainerRef()

export function navigate(name, params) {
  if (navigationRef.isReady()) {
    navigationRef.navigate(name, params);
  }
}  

然后您可以简单地导入 navigate 并像这样使用它。

navigate('ExtendedRegisteration');

这不是在任何地方都普遍使用的原因是因为当您有复杂的嵌套路由时,它可能会出现问题,并且它也不能让您访问其他导航方法,但对于像您这样的情况,它可以正常工作。

>

答案 1 :(得分:0)

“这”表示上下文,这是反应中最有趣的事情。 尝试console.log(this.props)来检查Firebase中的道具是否与其他示例相同。 由于从诺言内部调用了this,因此可以更改“ this”上下文。它发生的时间超出了预期的时间。

您可以尝试创建函数

constructor(props){
    super(props);
    this._onUserCreation = this._onUserCreation.bind(this);
}

_onUserCreation=()=>{this.props.navigation.navigate('ExtendedRegisteration')};

//SignUp.js
signUpHandler = () => {
        if (this.state.email == '' || this.state.password == '') {
            alert("Email or Password is empty.")
        }
        else {
            firebase.auth().createUserWithEmailAndPassword(this.state.email, this.state.password)
                .then(() => this._onUserCreation())
                .catch(error => { alert(error.message) });
        }
    }

答案 2 :(得分:0)

无论您从何处调用注册功能并将其用作该参数,都可以将其作为参数传递。

答案 3 :(得分:0)

确保在导航前卸载 FirebaseRecaptcha.FirebaseRecaptchaVerifierModal