Ошибка: не удалось найти значение контекста реакции-редукса; убедитесь, что компонент завернут в <Provider> в собственном приложении React Expo

Я получаю эту ошибку при попытке запустить приложение React-Native. Я пытаюсь создать приложение React-Native, в котором будет BottomNavBar и навигация по ящикам. Я использую Redux-Toolkit для управления состоянием. Я следил за документацией и получаю эту ошибку.

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

This error is located at:
    in App (at withDevTools.js:18)
    in withDevTools(App) (at renderApplication.js:57)
    in RCTView (at View.js:116)
    in View (at AppContainer.js:127)
    in RCTView (at View.js:116)
    in View (at AppContainer.js:155)
    in AppContainer (at renderApplication.js:50)
    in main(RootComponent) (at renderApplication.js:67), js engine: hermes

Приложение.js

import * as React from 'react';
import { NavigationContainer } from '@react-navigation/native';
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import { createDrawerNavigator } from '@react-navigation/drawer';
import { Provider, useDispatch, useSelector } from 'react-redux'; // Import Provider
import store from './store/store'; // Assuming your store is here
import { logout } from './store/authSlice'; // Assuming your logout action is here
import * as SecureStore from 'expo-secure-store';
import { Ionicons } from '@expo/vector-icons';

// Import your screen components (replace with your actual screens)
import HomeScreen from './screens/HomeScreen';
import SettingsScreen from './screens/SettingsScreen';
import ProfileScreen from './screens/ProfileScreen';
import FaqScreen from './screens/FaqScreen';
import LoginScreen from './screens/LoginScreen';
import LogoutScreen from './screens/LogoutScreen';
// ... (add other screens as needed)

const Tab = createBottomTabNavigator();
const Drawer = createDrawerNavigator();

const HomeIcon = ({ size, color }) => <Ionicons name = "home-outline" size = {size} color = {color} />;
const ProfileIcon = ({ size, color }) => <Ionicons name = "person-outline" size = {size} color = {color} />;
const SettingsIcon = ({ size, color }) => <Ionicons name = "settings-outline" size = {size} color = {color} />;
const LoginIcon = ({ size, color }) => <Ionicons name = "log-in-outline" size = {size} color = {color} />;

function MyTabs({ isLoggedIn }) {
  return (
    <Tab.Navigator screenOptions = {{headerShown: false}} initialRouteName = "Home">
      <Tab.Screen
        name = "Home"
        component = {HomeScreen}
        options = {{
          tabBarIcon: ({ color, size }) => <HomeIcon size = {size} color = {color} />,
        }}
      />
      <Tab.Screen
        name = "Settings"
        component = {SettingsScreen}
        options = {{
          tabBarIcon: ({ color, size }) => <SettingsIcon size = {size} color = {color} />,
        }}
      />
      {isLoggedIn ? (
        <Tab.Screen
          name = "Profile"
          component = {ProfileScreen}
          options = {{
            tabBarIcon: ({ color, size }) => <ProfileIcon size = {size} color = {color} />,
          }}
        />
      ) : (
        <Tab.Screen
          name = "Login"
          component = {LoginScreen}
          options = {{
            tabBarIcon: ({ color, size }) => <LoginIcon size = {size} color = {color} />,
          }}
        />
      )}
      
    </Tab.Navigator>
  );
}

function App() {
    const isLoggedIn = useSelector((state) => state.auth.isLoggedIn);
  return (
    <Provider store = {store}>
      <NavigationContainer initialRouteName = "Home">
        <Drawer.Navigator>
          <Drawer.Screen name = "Shop" component = {MyTabs} />
          <Drawer.Screen name = "FAQ" component = {FaqScreen} />
          {isLoggedIn ? <Drawer.Screen name = "Logout" component = {LogoutScreen} /> : null}
          {/* Add other drawer screens if needed */}
        </Drawer.Navigator>
      </NavigationContainer>
    </Provider>
  );
}

export default App;
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
138
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Компонент App отображает Redux Provider и поэтому не может сам получить доступ к какому-либо контексту Redux, поскольку ему ничего не предоставляется из более высокого уровня ReactTree. Он не может использовать крючок useSelector.

Обновите код так, чтобы App был обернут компонентом Provider и мог получить доступ к предоставленному контексту Redux.

Пример:

function App() {
  const isLoggedIn = useSelector((state) => state.auth.isLoggedIn);

  return (
    <NavigationContainer initialRouteName = "Home">
      <Drawer.Navigator>
        <Drawer.Screen name = "Shop" component = {MyTabs} />
        <Drawer.Screen name = "FAQ" component = {FaqScreen} />
        {isLoggedIn ? <Drawer.Screen name = "Logout" component = {LogoutScreen} /> : null}
        {/* Add other drawer screens if needed */}
      </Drawer.Navigator>
    </NavigationContainer>
  );
}

const AppProvider = () => (
  <Provider store = {store}>
    <App />
  </Provider>
);

export default AppProvider;

Другие вопросы по теме