如何在 React Native 中等待来自 Firebase 身份验证的持久用户
2019-05-12
2188
我在我的 React Native 应用程序中使用 firebase auth(通过 expo),身份验证通过观察者(包括持久用户)正常工作:
import firebase from "firebase";
firebase.auth().onAuthStateChanged(user => {
if (user) {
this.props.setUser(user);
}
}).bind(this);
我显示一个带有登录/注册的登录屏幕,如果用户使用帐户登录,我会转发到主应用程序。应用程序启动后,在加载持久用户时, onAuthStateChanged 方法需要一段时间才能触发,这导致我的应用程序短暂显示此登录屏幕然后离开。 我更希望有一个加载屏幕,直到正确确定身份验证状态。
但如果没有持久用户,onAuthStateChanged 永远不会触发,所以我没有要等待的特定事件。我可以使用超时计时器,但这似乎不是一个好的解决方案,因为必要的等待时间可能因硬件和连接速度的不同而有很大差异。
如何正确解决这个问题,即我如何知道没有持久用户?
2个回答
var isLoading = true;
firebase.auth().onAuthStateChanged(user => {
if (user) {
isLoading = false;
this.props.setUser(user);
}
}, error => {
isLoading = false;
}
}).bind(this);
QuokMoon
2019-05-13
onAuthStateChanged 仅在加载完成后才会触发其功能。因此,当触发时,您可以假定身份验证已完成加载,而不管用户的值如何。我最终使用 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]);
...
}
Logan Lim
2021-02-26