React Native中Firestore数据传入Context失败,求问题排查方案
问题分析与修复方案
先给你捋下代码里的几个关键问题:
- Auth状态未就绪时访问
currentUser会报错:auth().currentUser可能在组件初始化时还没拿到值(比如用户还没完成登录校验),直接取uid会抛出错误,导致Firestore请求失败。 - 没有自动触发数据获取:你把获取数据的逻辑放在了
unit方法里,但这个方法不会自动执行,除非你在组件内部或者子组件里主动调用它,不然contextWeight永远不会被赋值。 async/await和then/catch混用:既然用了async,就没必要再嵌套then,代码可以更简洁,也更容易排查问题。
下面是修复后的代码:
export const AuthProvider = ({children}) => { const [user, setUser] = useState(); const [contextWeight, setContextWeight] = useState(); const [loading, setLoading] = useState(true); // 新增加载状态,避免undefined的问题 // 组件挂载时自动获取数据 useEffect(() => { const fetchWeightUnit = async () => { try { // 先确认用户已登录 const currentUser = auth().currentUser; if (!currentUser) { console.log("用户未登录"); setLoading(false); return; } const docSnapshot = await firestore() .collection('users') .doc(currentUser.uid) .collection('products') .doc('product') .get(); if (docSnapshot.exists) { setContextWeight(docSnapshot.data().weightUnit); } else { console.log("目标文档不存在"); } } catch (error) { console.error("获取数据失败:", error); } finally { setLoading(false); } }; fetchWeightUnit(); }, []); // 空依赖数组,只在组件挂载时执行一次 return ( <AuthContext.Provider value={{ user, setUser, contextWeight, setContextWeight, loading // 把加载状态传到Context,方便子组件处理加载逻辑 }}> {children} </AuthContext.Provider> ); };
额外建议:
- 如果需要监听用户登录状态变化(比如用户登录/登出时重新获取数据),可以给
useEffect添加auth().currentUser作为依赖,或者使用Auth的监听方法onAuthStateChanged。 - 可以给
contextWeight设置一个默认值(比如''或者'kg'),避免子组件使用时出现undefined的情况。
内容的提问来源于stack exchange,提问作者n0bi
相关产品推荐
相关产品推荐

