You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native Firebase应用:基于onAuthStateChange切换Stack.Screen

React Native Firebase 登录状态自动切换页面方案(SDK 46.0)

核心思路

通过监听Firebase Auth的用户状态变化,动态控制导航栈的初始路由,或者在登录操作完成后直接跳转页面,实现登录后自动从LoginScreen切换到HomeScreen的需求。

实现方案

方案一:监听认证状态,动态设置初始路由(解决应用重启自动登录场景)

在导航入口文件(比如App.js)中监听用户认证状态,根据用户是否存在决定初始显示的页面:

import React, { useState, useEffect } from 'react';
import { NavigationContainer } from '@react-navigation/native';
import { createNativeStackNavigator } from '@react-navigation/native-stack';
import { getAuth, onAuthStateChanged } from 'firebase/auth';
import LoginScreen from './screens/LoginScreen';
import HomeScreen from './screens/HomeScreen';

const Stack = createNativeStackNavigator();

export default function App() {
  const [user, setUser] = useState(null);
  const auth = getAuth();

  useEffect(() => {
    // 订阅用户认证状态变化
    const unsubscribe = onAuthStateChanged(auth, (currentUser) => {
      setUser(currentUser);
    });

    // 组件卸载时取消订阅,避免内存泄漏
    return unsubscribe;
  }, [auth]);

  return (
    <NavigationContainer>
      <Stack.Navigator
        initialRouteName={user ? 'Home' : 'Login'}
        screenOptions={{ headerShown: false }}
      >
        <Stack.Screen name="Login" component={LoginScreen} />
        <Stack.Screen name="Home" component={HomeScreen} />
      </Stack.Navigator>
    </NavigationContainer>
  );
}

方案二:登录成功后直接跳转(处理主动登录场景)

在LoginScreen中完成登录操作后,调用导航的replace方法跳转到HomeScreen(用replace避免用户通过返回键回到登录页):

import { getAuth, signInWithEmailAndPassword } from 'firebase/auth';
import { View, TextInput, Button, Alert } from 'react-native';
import React, { useState } from 'react';

export default function LoginScreen({ navigation }) {
  const [email, setEmail] = useState('');
  const [password, setPassword] = useState('');
  const auth = getAuth();

  const handleLogin = async () => {
    try {
      await signInWithEmailAndPassword(auth, email, password);
      // 登录成功后替换当前路由为Home
      navigation.replace('Home');
    } catch (error) {
      Alert.alert('登录失败', error.message);
    }
  };

  return (
    <View style={{ padding: 20, justifyContent: 'center', flex: 1 }}>
      <TextInput
        placeholder="邮箱"
        value={email}
        onChangeText={setEmail}
        keyboardType="email-address"
        style={{ borderBottomWidth: 1, marginBottom: 15, padding: 8 }}
      />
      <TextInput
        placeholder="密码"
        value={password}
        onChangeText={setPassword}
        secureTextEntry
        style={{ borderBottomWidth: 1, marginBottom: 20, padding: 8 }}
      />
      <Button title="登录" onPress={handleLogin} />
    </View>
  );
}

关键注意事项

  • 两种方案结合使用效果最佳:监听状态处理自动登录,登录操作后直接跳转处理主动登录场景。
  • 使用navigation.replace而非navigation.navigate,确保登录后无法返回登录页面。
  • 确保已在项目中正确初始化Firebase Auth(完成Firebase配置文件的引入和初始化步骤)。

内容的提问来源于stack exchange,提问作者David Guri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 15:34:43