React Native Stack导航报错:HomeScreen不存在问题求助
问题解决:React Native Firebase认证后无法导航到HomeScreen
你的判断完全正确——App.js里的user状态初始为null,且登录/注册过程中没有同步更新这个状态,导致导航器的条件渲染始终只加载Login和Registration屏幕,找不到HomeScreen,所以触发导航报错。以下是具体修复方案:
1. 监听Firebase Auth用户状态,同步更新App状态
在App.js中添加Firebase认证状态监听,确保用户登录、注册或启动App时,user状态能实时更新:
import { useEffect } from 'react'; import firebase from 'firebase/app'; export default function App() { const [loading, setLoading] = useState(true); const [user, setUser] = useState(null); useEffect(() => { // 监听用户认证状态变化 const unsubscribe = firebase.auth().onAuthStateChanged(async (authUser) => { if (authUser) { // 登录成功后,从Firestore拉取用户详细信息 const userDoc = await firebase.firestore().collection('users').doc(authUser.uid).get(); if (userDoc.exists) { setUser(userDoc.data()); } } else { setUser(null); } setLoading(false); // 加载完成,渲染导航器 }); // 组件卸载时取消监听,避免内存泄漏 return unsubscribe; }, []); // 加载状态显示(可选,提升用户体验) if (loading) { return <View><Text>加载中...</Text></View>; } return ( <NavigationContainer> <Stack.Navigator> {user ? ( <Stack.Screen name="HomeScreen" component={HomeScreen} /> ) : ( <> <Stack.Screen name="Login" component={LoginScreen} /> <Stack.Screen name="Registration" component={RegistrationScreen} /> </> )} </Stack.Navigator> </NavigationContainer> ); }
2. 简化登录/注册后的导航逻辑
因为App.js的user状态会自动更新,导航器会自动切换到HomeScreen,所以可以去掉登录/注册里手动传递user参数的导航代码:
修改LoginScreen的onLoginPress:
const onLoginPress = () => { firebase .auth() .signInWithEmailAndPassword(email, password) .catch((error) => { alert(error); }); };
修改RegistrationScreen的onRegisterPress:
const onRegisterPress = () => { if (password !== confirmPassword) { alert("密码不匹配。"); return; } firebase .auth() .createUserWithEmailAndPassword(email, password) .then((response) => { const uid = response.user.uid; const data = { id: uid, email, fullName, }; return firebase.firestore().collection('users').doc(uid).set(data); }) .catch((error) => { alert(error); }); };
3. (可选)在HomeScreen获取用户信息
如果需要在HomeScreen中使用用户数据,可以直接通过Firebase Auth获取,或者从App状态传递:
import firebase from 'firebase/app'; export default function HomeScreen() { const currentUser = firebase.auth().currentUser; return ( <View> <Text>欢迎,{currentUser?.email}</Text> </View> ); }
内容的提问来源于stack exchange,提问作者LessWinsMoreLosses
相关产品推荐
相关产品推荐

