【问题标题】:Creating Wrapper for App Component in React Native Expo在 React Native Expo 中为 App 组件创建包装器
【发布时间】:2021-07-29 03:26:05
【问题描述】:

我需要以某种方式从 App.js 访问我的 Redux 商店,从 docs 它说我可以为我的 App 创建新的入口点,所以我确实创建了一个,但不知何故我的 App 仍然无法访问 Redux Store。

Error: could not find react-redux context value; please ensure the component is wrapped in a <Provider>

这是我的 App.js 代码

import React, { useState, useEffect } from "react";
import { NavigationContainer } from "@react-navigation/native";
import { createStackNavigator } from "@react-navigation/stack";
import { useFonts } from "expo-font";
import AppLoading from "expo-app-loading";
import { Provider } from "react-redux";
import { useDispatch, useSelector } from "react-redux";

//Layout
import Auth from "./src/layout/Auth.layout";
import Register from "./src/layout/Register.layout";
import Drawer from "./src/navigation/Drawer";
export default function App() {
  const Stack = createStackNavigator();
  const { isLoggedIn } = useSelector((state) => state.user);
  const [isLoading, setIsLoading] = useState(false);

  let [fontsLoaded] = useFonts({
    DMSans: require("./assets/fonts/DMSans-Regular.ttf"),
    "DMSans-Medium": require("./assets/fonts/DMSans-Medium.ttf"),
    "DMSans-Bold": require("./assets/fonts/DMSans-Bold.ttf"),
  });

  if (!fontsLoaded || isLoading) {
    return <AppLoading />;
  } else {
    return (
      <NavigationContainer>
        {!isLoggedIn ? (
          <Stack.Navigator
            initialRouteName="Auth"
            screenOptions={{ headerShown: false }}
          >
            <Stack.Screen name="Auth" component={Auth} />
            <Stack.Screen name="Register" component={Register} />
          </Stack.Navigator>
        ) : (
          <Drawer />
        )}
      </NavigationContainer>
    );
  }
}

这是我创建的 EntryPoint.js

import { registerRootComponent } from "expo";
import App from "../App";
import React from "react";
import { store, persistor } from "./state/store";
import { PersistGate } from "redux-persist/es/integration/react";
import { Provider } from "react-redux";

export default function EntryPoint() {
  return (
    <Provider store={store}>
      <PersistGate persistor={persistor}>
        <App />
      </PersistGate>
    </Provider>
  );
}

registerRootComponent(EntryPoint);

我在这里缺少什么?还是我可以实施更好的解决方案?

【问题讨论】:

    标签: reactjs react-native redux react-redux


    【解决方案1】:

    解决了,我最终删除了 EntryPoint.js 并在我的 App.js 中创建了一个包装器。

    App.js 代码:

    import React, { useState, useEffect } from "react";
    import { NavigationContainer } from "@react-navigation/native";
    import { createStackNavigator } from "@react-navigation/stack";
    import { useFonts } from "expo-font";
    import AppLoading from "expo-app-loading";
    import { Provider } from "react-redux";
    
    //Layout
    import Auth from "./src/layout/Auth.layout";
    import Register from "./src/layout/Register.layout";
    import Drawer from "./src/navigation/Drawer";
    import { store, persistor } from "./src/state/store";
    import { PersistGate } from "redux-persist/es/integration/react";
    import { useSelector } from "react-redux";
    
    const AppWrapper = () => {
      const Stack = createStackNavigator();
      const { isLoggedIn } = useSelector((state) => state.user);
      const [isLoading, setIsLoading] = useState(false);
    
      let [fontsLoaded] = useFonts({
        DMSans: require("./assets/fonts/DMSans-Regular.ttf"),
        "DMSans-Medium": require("./assets/fonts/DMSans-Medium.ttf"),
        "DMSans-Bold": require("./assets/fonts/DMSans-Bold.ttf"),
      });
      if (!fontsLoaded || isLoading) {
        return <AppLoading />;
      } else {
        return (
          <NavigationContainer>
            {!isLoggedIn ? (
              <Stack.Navigator
                initialRouteName="Auth"
                screenOptions={{ headerShown: false }}
              >
                <Stack.Screen name="Auth" component={Auth} />
                <Stack.Screen name="Register" component={Register} />
              </Stack.Navigator>
            ) : (
              <Drawer />
            )}
          </NavigationContainer>
        );
      }
    };
    
    export default function App() {
      return (
        <Provider store={store}>
          <PersistGate persistor={persistor}>
            <AppWrapper />
          </PersistGate>
        </Provider>
      );
    }

    【讨论】:

      猜你喜欢
      • 2021-10-22
      • 2017-10-21
      • 2021-03-04
      • 2023-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-22
      • 2021-03-04
      相关资源
      最近更新 更多