Firebase Auth报错:null is not an object,登录跳转Tabs页面后currentUser.uid为空问题问询
解决
null is not an object (evaluating 'currentUser.uid')错误 问题根源
你的代码存在两个核心问题:
currentUser未关联到AuthContext的用户状态:在Tabs.js里你直接使用currentUser,但没有从Routes.js中配置的AuthContext获取这个用户实例,导致它默认是null或未定义状态。- 未处理Auth状态的异步特性:即使正确获取了用户对象,组件渲染时Auth状态可能还没完成更新,此时
user仍为null,直接访问user.uid就会触发报错。
修复步骤
1. 在Tabs.js中正确获取AuthContext的用户
首先确保Tabs组件导入了你的AuthContext,然后通过useContext钩子拿到当前用户:
import { useContext, useState, useEffect } from 'react'; import { AuthContext } from './path-to-your-AuthContext-file'; // 替换成你的AuthContext实际路径 import { firestore } from './path-to-your-firebase-config'; // 替换成你的Firebase配置路径 const Tabs = () => { const { user } = useContext(AuthContext); const [name, setName] = useState(''); const [groupID, setGroupID] = useState(''); // 后续修复代码写在这里 }
2. 仅当用户存在时执行Firestore查询
用useEffect监听user的变化,只有当user不为空时才发起Firestore请求,避免空值访问:
useEffect(() => { // 如果用户未加载完成,直接返回 if (!user) return; const fetchUserData = async () => { const documentSnapshot = await firestore() .collection('Users') .doc(user.uid) .get(); if (documentSnapshot.exists) { setName(documentSnapshot.data().name); setGroupID(documentSnapshot.data().group); } }; fetchUserData(); }, [user]); // 当user状态变化时重新执行查询
3. 添加加载状态(可选但推荐)
为了提升用户体验,可以在Tabs组件中添加加载状态,避免用户看到空白或错误内容:
const [isLoading, setIsLoading] = useState(true); useEffect(() => { if (!user) { setIsLoading(false); return; } const fetchUserData = async () => { setIsLoading(true); const documentSnapshot = await firestore() .collection('Users') .doc(user.uid) .get(); if (documentSnapshot.exists) { setName(documentSnapshot.data().name); setGroupID(documentSnapshot.data().group); } setIsLoading(false); }; fetchUserData(); }, [user]); // 渲染时先判断加载状态 if (isLoading) { return <View><Text>加载中...</Text></View>; // 替换成你项目中的加载组件 } // 正常渲染Tabs内容 return ( // 你的Tabs组件结构 );
为什么之前的代码会出错?
你在Routes.js里通过onAuthStateChanged监听用户状态,但Tabs组件并没有订阅这个状态,而是直接使用了一个未定义的currentUser。另外,Auth状态的更新是异步的,组件初始化时user很可能还是null,此时直接访问user.uid自然会抛出错误。
内容的提问来源于stack exchange,提问作者Odium
相关产品推荐
相关产品推荐

