繁体   English   中英

React Native && Firebase && useContext - "TypeError: null is not an object (evalating '_ref.user')" with onAuthStateChanged 错误

[英]React Native && Firebase && useContext - "TypeError: null is not an object (evaluating '_ref.user')" with onAuthStateChanged error

该错误发生在我的 useCachedResources.ts 文件中,但我不确定原因。 这是我正在使用的三个文件。 我怀疑这与第一次最初为 null 的值有关,但我有条件地呈现我的 Auth 和 App 导航堆栈。 此外,模板提供了 useCachedResources ,所以也许我应该在其中添加 firebase onAuthStateChanged ?

AuthenticatedUserProvider.tsx

import { useState, createContext } from 'react';

export interface IUser {
  uuid: string;
  email: string | null;
}

export type AuthContextType = {
  user: IUser;
  setUser: (newUser: IUser | null) => void;
};

export const AuthenticatedUserContext = createContext<AuthContextType | null>(null);

export const AuthenticatedUserProvider = ({ children }: { children: React.ReactNode }) => {
  const [user, setUser] = useState<IUser | null>(null);

  return (
    <AuthenticatedUserContext.Provider value={user ? { user, setUser } : null}>
      {children}
    </AuthenticatedUserContext.Provider>
  );
};

导航.ts

export default function Navigation({ colorScheme }: { colorScheme: ColorSchemeName }) {
  const { user } = useContext(AuthenticatedUserContext) as AuthContextType;

  return (
    <NavigationContainer linking={LinkingConfiguration} theme={colorScheme === 'dark' ? DarkTheme : DefaultTheme}>
      {user ? <AppStack /> : <AuthStack />}
    </NavigationContainer>
  );
}

useCachedResources.ts

export default function useCachedResources() {
  const { user, setUser } = useContext(AuthenticatedUserContext) as AuthContextType;
  const [isLoadingComplete, setLoadingComplete] = useState(false);

  useEffect(() => {
    async function loadResourcesAndDataAsync() {
      try {
        SplashScreen.preventAutoHideAsync();

        await Font.loadAsync({
          ...FontAwesome.font,
          'poppins-400': require('../assets/fonts/poppins-400.ttf'),
          'poppins-700': require('../assets/fonts/poppins-700.ttf'),
          'poppins-900': require('../assets/fonts/poppins-900.ttf'),
        });

        const unsubscribeAuthStateChanged = onAuthStateChanged(auth, (authenticatedUser) => {
          authenticatedUser ? setUser({ uuid: authenticatedUser.uid, email: authenticatedUser.email }) : setUser(null);
        });

        return unsubscribeAuthStateChanged;
      } catch (e) {
        console.warn(e);
      } finally {
        setLoadingComplete(true);
        SplashScreen.hideAsync();
      }
    }

    loadResourcesAndDataAsync();
  }, [user]);

  return isLoadingComplete;
}

在此处输入图像描述

因为您使用null初始化上下文,所以不能使用解构。 例如,这...

const { user } = null;

在浏览器中生成以下错误

未捕获的类型错误:无法解构“null”的属性“user”,因为它为 null。

我的建议是使用虚拟值初始化您的上下文。 这也将使您不必在任何地方都使用as AuthContextType

export type AuthContextType = {
  user: IUser | null; // make user optional instead of the context
  setUser: (newUser: IUser | null) => void;
};

// initialise with a dummy / no-op context
export const AuthenticatedUserContext = createContext<AuthContextType>({
  user: null,
  setUser: () => {}
});

export const AuthenticatedUserProvider: React.FC = ({ children }) => {
  const [user, setUser] = useState<IUser | null>(null);

  return (
    <AuthenticatedUserContext.Provider value={{ user, setUser }}>
      {children}
    </AuthenticatedUserContext.Provider>
  );
};

TypeError: 无法分配给 object 的只读属性 '#<object> ' Redux Tool Kit Slice for Firebase Storage REACT NATIVE<div id="text_translate"><p> 您好,我在上传到 firebase 存储后尝试设置我的 downloadUrl,但我似乎无法让它与 Redux 工具包一起使用。 我有一个解决方案,但我宁愿以正确的方式使用它,但我似乎无法弄清楚它是否愿意得到一些反馈</p><pre> incrementByAmount: (state, action) =&gt; { state.value += action.payload },</pre><p> 这是<strong>文档</strong>示例。 我知道数字与对象的工作方式不同,<strong>但如果他们可以像这样改变它,为什么我不能呢?</strong></p><pre> setImageUrl: (state, action: PayloadAction&lt;string&gt;) =&gt; { state.imageUrl = action.payload; },</pre><p> <strong>这就是我所说的</strong></p><pre> const downloadUrl = await FirebaseStorageService.uploadFile( photo, setUploadProgress ); dispatch(setImageUrl(downloadUrl));</pre><p> 这是错误</p><pre>ossible Unhandled Promise Rejection (id: 5): TypeError: Cannot assign to read only property 'imageUrl' of object '#&lt;Object&gt;' TypeError: Cannot assign to read only property 'imageUrl' of object '#&lt;Object&gt;'</pre><p> 提前谢谢你 我在其他地方看到过类似的问题,但我觉得答案不清楚。 我可以直接或不使用 RTK 更改 object 的属性吗?</p></div></object>

[英]TypeError: Cannot assign to read only property '' of object '#<Object>' Redux Tool Kit Slice for Firebase Storage REACT NATIVE

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何在 Vue ref 中存储 Firebase 9 onAuthStateChanged 用户 object? TypeError: undefined is not an object (evalating &#39;icons.map&#39;) React-Native 反应:TypeError:_useContext 未定义 TypeError: undefined is not an object (评估'_$$_REQUIRE(_dependencyMap[32], "react-native-safe-area-context").SafeAreaView') TypeError: undefined is not an object (evaluating '_$$_REQUIRE(_dependencyMap[58], "@react-navigation/native").NavigationContainer') 反应本机组件异常:未定义不是对象(评估&#39;_this&#39;) useRef 不工作 [TypeError: null 不是 object(评估 'filed2.current.focus')] 在 ref 滚动视图上反应本机错误,但工作正常 未处理的承诺拒绝:TypeError:null 不是对象(评估 camera.pictureSize) TypeError: 无法分配给 object 的只读属性 '#<object> ' Redux Tool Kit Slice for Firebase Storage REACT NATIVE<div id="text_translate"><p> 您好,我在上传到 firebase 存储后尝试设置我的 downloadUrl,但我似乎无法让它与 Redux 工具包一起使用。 我有一个解决方案,但我宁愿以正确的方式使用它,但我似乎无法弄清楚它是否愿意得到一些反馈</p><pre> incrementByAmount: (state, action) =&gt; { state.value += action.payload },</pre><p> 这是<strong>文档</strong>示例。 我知道数字与对象的工作方式不同,<strong>但如果他们可以像这样改变它,为什么我不能呢?</strong></p><pre> setImageUrl: (state, action: PayloadAction&lt;string&gt;) =&gt; { state.imageUrl = action.payload; },</pre><p> <strong>这就是我所说的</strong></p><pre> const downloadUrl = await FirebaseStorageService.uploadFile( photo, setUploadProgress ); dispatch(setImageUrl(downloadUrl));</pre><p> 这是错误</p><pre>ossible Unhandled Promise Rejection (id: 5): TypeError: Cannot assign to read only property 'imageUrl' of object '#&lt;Object&gt;' TypeError: Cannot assign to read only property 'imageUrl' of object '#&lt;Object&gt;'</pre><p> 提前谢谢你 我在其他地方看到过类似的问题,但我觉得答案不清楚。 我可以直接或不使用 RTK 更改 object 的属性吗?</p></div></object>
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM