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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 15:25:41