如何在React Native中等待来自Firebase身份验证的持久用户

时间:2019-05-12 23:07:33

标签: javascript firebase react-native firebase-authentication expo

我在React Native App中使用firebase auth(通过expo),通过观察者(包括永久用户)可以正常进行身份验证:

import firebase from "firebase";

firebase.auth().onAuthStateChanged(user => {
    if (user) {
        this.props.setUser(user);
    }
}).bind(this);

我显示一个具有登录/注册功能的登录屏幕,如果用户使用帐户登录,我将转发至主应用程序。应用启动后,加载持久性用户时, onAuthStateChanged 方法需要花一点时间,这导致我的应用短暂显示此着陆屏幕,然后离开。 我希望有一个加载屏幕,直到正确确定身份验证状态为止。

但是,如果没有永久用户,则onAuthStateChanged永远不会触发,因此我没有要等待的特定事件。我可以使用超时计时器,但这似乎是一个糟糕的解决方案,因为必要的等待时间可能会因硬件和连接速度而有很大差异。

如何正确解决此问题,即如何知道没有永久用户?

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

onAuthStateChanged 只有在加载完成后才会触发它的功能。因此,当触发时,无论 user 的值如何,您都可以假设身份验证已完成加载。我最终使用 expo-splash-screen 在身份验证加载时显示加载屏幕。

示例:

export default () => {
    const [isAuthenticationLoaded, setIsAuthenticationLoaded] = React.useState(false);

    firebase.auth().onAuthStateChanged((user) => {
        if (user) setUser(user);
        setIsAuthenticationLoaded(true);
    });

   React.useEffect(() => {
        SplashScreen.preventAutoHideAsync();
    }, []);

    React.useEffect(() => {
        if (isAuthenticationLoaded) {
            SplashScreen.hideAsync();
        }
    }, [isAuthenticationLoaded]);
    ...
}