Firebase 在重新加载 Expo 时注销用户

Firebase logs out user when reloading Expo

Firebase 屏幕

import  firebase from 'firebase/compat/app';
import 'firebase/compat/auth';
import 'firebase/compat/firestore';

const firebaseConfig = {
    apiKey: "xxxxx",
    authDomain: "xxxx",
    projectId: "xxxxx",
    storageBucket: "xxxxx",
    messagingSenderId: "xxxxxxx",
    appId: "xxxxxxxx",
    measurementId: "xxxxxx"
};

let app;

if (firebase.apps.length === 0) {
  app = firebase.initializeApp(firebaseConfig)
} else {
  app = firebase.app();
}


const db = app.firestore();
const auth = firebase.auth();
const api = firebase.app();
const phoneAuth = firebase.auth;

export { db, auth, api, phoneAuth};

应用程序屏幕

//redux
import {Provider} from 'react-redux';
import { createStore, applyMiddleware } from "redux";
import rootReducer from "./redux/reducers";
import thunk from "redux-thunk";
import { auth } from './src/config/firebase';


const store = createStore(rootReducer, applyMiddleware(thunk));

const Stack = createNativeStackNavigator();



export class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      loaded: false,
    };
  }

   componentDidMount() {
     auth.onAuthStateChanged((user) => {
      console.log(user)<------------------------------------------
      if (!user) {
        this.setState({
          loggedIn: false,
          loaded: true,
        });
      } else {
        this.setState({
          loggedIn: true,
          loaded: true
        });
      }
    });
  }

  

    render() {
      const { loggedIn, loaded } = this.state;

      if (!loaded) {
        return (
          <SafeAreaView>
              <Text>Template</Text>
              <ActivityIndicator  size='large' color='white'/>
          </SafeAreaView>
        );
      }
      if(!loggedIn) {
        return (
          <Provider store={store}>
            <NavigationContainer>
              <Stack.Navigator>
                <Stack.Screen name="Landing" component={LandingScreen}/>
                <Stack.Screen name="Register" component={RegisterScreen}/>
                <Stack.Screen name="SignGuest" component={SignGuestScreen}/>
                <Stack.Screen name="VerifyPhoneNumber" component={VerifyPhoneNumberScreen} />
                <Stack.Screen name="AddressSearchPage" component={AddressSearchPageScreen} />
                <Stack.Screen name="AddressSearch" component={AddressSearchScreen} />
              </Stack.Navigator>
            </NavigationContainer>
          </Provider>
        )
      }
        return (
          <Provider store={store}>
            <NavigationContainer>
              <Stack.Navigator>
                <Stack.Screen name="TabNavigator" component={TabNavigatorScreen} />
                <Stack.Screen name="Account" component={AccountScreen}/>
                <Stack.Screen name="Cart" component={CartScreen}/>
                <Stack.Screen name="RegisterModal" component={RegisterModalScreen} />
                <Stack.Screen name="AddressSearch" component={AddressSearchScreen} />
                <Stack.Screen name="DisplayItem" component={DisplayItemScreen} />
              </Stack.Navigator>
            </NavigationContainer>
        </Provider>
      )}
  }

  export default App;

Firebase 在重新加载 expo 时注销用户。我在 componentDidMount 中放置了一个 console.log 以查看问题,并且在应用程序重新加载后 returns null

老实说,我不明白问题出在哪里。

我希望用户保持登录状态。我尝试了很多方法并阅读了很多教程,但它似乎不起作用。

要为您的身份验证问题添加解决方法,您可以应用模块化方法,而不是使用 firebase 中的兼容方法。

根据文档,如果您已经在使用 firebase v8 SDK,Compat 是一种临时解决方法

它应该可以,但我也不知道为什么它不起作用。

为此,我创建了一个演示并使用了 firebase 的模块化方法,它工作正常

查看文档:Firebase Modular Update documentation

您可以使用 firebase 的模块化方法来实现身份验证功能。

代码。

import React, { useEffect } from "react";
import { View, Button } from 'react-native'
import { initializeApp } from 'firebase/app'
import { getAuth, signInWithEmailAndPassword } from "firebase/auth";

const App = () => {
  async function logIn() {
    try {
      const loginRes = await signInWithEmailAndPassword(getAuth(), 'user@gmail.com', 'xxxxxx')
      console.log('loginRes : ', loginRes.user?.email)
    } catch ({ message }) {
      console.log('[Error] logIn : ', message)
    }
  }

  useEffect(() => {
    const firebaseConfig = {
      apiKey: "xxxxxx",
      authDomain: "xxxxx",
      projectId: "xxxxxx",
      storageBucket: "xxxxxx",
      messagingSenderId: "xxxxxx",
      appId: "xxxxxx",
      measurementId: "xxxxxx"
    };

    // Initialize Firebase
    initializeApp(firebaseConfig);

    // Adding listener for firebase auth
    const unsubscribe = getAuth().onAuthStateChanged((user) => {
      if (user) {
        console.log('user already loggen in')
      } else {
        console.log('user not logged in')
      }
    });

    return unsubscribe
  }, [])

  return (
    <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
      <Button title="Button" onPress={logIn} />
    </View>
  )
}

export default App