firebase.auth().signOut() 在单击注销后未重定向回 mainNav

Posted

技术标签:

【中文标题】firebase.auth().signOut() 在单击注销后未重定向回 mainNav【英文标题】:firebase.auth().signOut() not redirecting back to mainNav after clicking logout 【发布时间】:2021-11-11 04:13:12 【问题描述】:

我正在使用 react native 和 firebase 构建一个简单的 react native 应用程序,并在尝试注销用户时遇到一个小问题,目前当按下注销时,它不会重定向回登录页面。

首页

<Text>Home Screen</Text>
            <Button title="Sign Out" onPress=signOut />

退出功能

    const signOut = async () => 
        firebase.auth().signOut();
    

主导航

const MainNav : FC = () => 
    const [user, setUser] = useState<firebase.User | null>(null);

    const bootstrap = () => 
        firebase.auth().onAuthStateChanged(_user => 
            if(_user)
                setUser(_user)
            
        )
    

    

    useEffect(() => 
        bootstrap()
    , [])


    return (
        <NavigationContainer>
            user !== null ? <AppStack /> : <AuthStack />
        </NavigationContainer>
    )


export default MainNav;

授权栈

import React,  FC  from 'react';
import createStackNavigator from '@react-navigation/stack'
import SignUp, Login from '../screens'
const Navigator, Screen = createStackNavigator();

const AuthStack : FC = () => 
    return (
        <Navigator screenOptions=headerShown: false>
            <Screen name="signup" component=SignUp/>
            <Screen name="login" component=Login/>
        </Navigator>
    )
 

export default AuthStack;

应用堆栈

const AppStack : FC = () => 
    return (
        <Navigator screenOptions=headerShown: false>
            <Screen name="home" component=Home/>
            <Screen name="dashboard" component=Dashboard/>
        </Navigator>
    )
 

export default AppStack;

【问题讨论】:

【参考方案1】:

那是因为您实际上忽略了注销事件:

const bootstrap = () => 
  firebase.auth().onAuthStateChanged(_user => 
    if(_user)  // <-- this will be null when logged out!
      setUser(_user)
    
  )

此外,您不应该像您在这里一样包装onAuthStateChanged 函数并忽略它的返回值(它是取消订阅函数):

useEffect(() => 
  bootstrap()
, [])

您应该使用(或它的变体):

useEffect(() => firebase.auth().onAuthStateChanged(_user => setUser(_user)), [])

上面的行使用来自firebase.auth() 的最新值更新user,并在卸载组件时正确取消订阅侦听器。

【讨论】:

以上是关于firebase.auth().signOut() 在单击注销后未重定向回 mainNav的主要内容,如果未能解决你的问题,请参考以下文章

Firebase Auth Anonymouse Registration/Login for Android java

Firebase auth 和 React Hook - 从钩子返回函数不起作用

我无法从 firebase 退出,但用户仍然不是 null

firebase模块的动态加载? (v9)

致命错误:找不到模块“firebase_auth”@import firebase_auth

GeneratedPluginConstraint,致命错误:找不到模块“firebase_auth”@import firebase_auth;