react-native - 在“Connect(HomeScreen)”的上下文中找不到“store”。将根组件包装在...中或传递自定义的 React 上下文提供程序
问题描述
检查许多已经问过的问题,但仍然无法弄清楚这一点。
我们正在使用重写我们的身份验证层
export default AuthContext = React.createContext();
并将它包裹在我们的 AppNavigator 周围
function AppNavigator(props) {
const [state, dispatch] = useReducer(accountReducer, INITIAL_STATE);
const authContext = React.useMemo(
() => ({
loadUser: async () => {
const token = await keychainStorage.getItem("token");
if (token) {
await dispatch({ type: SIGN_IN_SUCCESS, token: token });
}
},
signIn: async (data) => {
client
.post(LOGIN_CUSTOMER_RESOURCE, data)
.then((res) => {
const token = res.data.accessToken;
keychainStorage.setItem("token", token);
dispatch({ type: SIGN_IN_SUCCESS, token: token });
})
.catch((x) => {
dispatch({ type: SIGN_IN_FAIL });
});
},
signOut: () => {
client.delete({
LOGOUT_CUSTOMER_RESOURCE
});
dispatch({ type: SIGN_OUT_SUCCESS });
}
}),
[]
);
console.log("token start", state.token);
return (
<AuthContext.Provider value={authContext}>
<NavigationContainer
theme={MyTheme}
ref={(navigatorRef) => {
NavigationService.setTopLevelNavigator(navigatorRef);
}}
onStateChange={(state) => {
NavigationService.setAnalytics(state);
}}
>
<AppStack.Navigator initialRouteName="App" screenOptions={hideHeader}>
{state.token != null ? (
<AppStack.Screen name="App" component={AuthMainTabNavigator} />
) : (
<>
<AppStack.Screen name="App" component={MainTabNavigator} />
<AppStack.Screen name="Auth" component={AuthNavigator} />
</>
)}
</AppStack.Navigator>
</NavigationContainer>
</AuthContext.Provider>
);
}
export default AppNavigator;
App.js - 渲染功能
<Root>
<StoreProvider store={store} context={AuthContext}>
<PersistGate loading={null} persistor={persistor}>
<SafeAreaProvider>
<AppNavigator context={AuthContext}/>
</SafeAreaProvider>
</PersistGate>
</StoreProvider>
</Root>
HomeScreen.js
export default connect(mapStateToProps, mapDispatchToProps, null, { context: AuthContext })(HomeScreen);
但仍然收到
Error: Could not find "store" in the context of "Connect(HomeScreen)". Either wrap the root component in a <Provider>, or pass a custom React context provider to <Provider> and the corresponding React context consumer to Connect(HomeScreen) in connect options.
我们浏览了 REDUX 文档:
https://react-redux.js.org/using-react-redux/accessing-store#using-the-usestore-hook
根本无法弄清楚为什么我们会收到此错误。
解决方案
我不确定您要在这里完成什么,但这是非常错误的:
export default connect(mapStateToProps, mapDispatchToProps, null, { context: AuthContext })(HomeScreen);
看起来你把两种不同的东西混在一起了。您正在尝试创建一个与您自己的身份验证状态一起使用的上下文,但您也在尝试使用相同的上下文实例来覆盖 React-Redux 自己的默认上下文实例。 不要那样做!除非在极少数情况下,否则 不应将自定义上下文实例传递给connect
和。<Provider>
推荐阅读
- css - React NextJS CSS - 部分的高度设置为父高度的 100%,但给出页面高度的 100%
- android - 通知通道自定义声音仅在我在模拟器上运行应用程序进程时才有效
- python - 用户不能在 Flask (SQLAlchemy) 中关注组
- python - SQLite3 - 跨表 SELECT 查询
- reactjs - 如何从 Django(后端)向 React Native(移动)应用程序发送通知
- java - 服务器上有应用程序的三个实例。但我们想在应用程序的一个实例上执行 cronjob 调度逻辑
- javascript - 需要帮助使用 chrome.webRequest 来阻止使用 Chrome 扩展程序的网站
- css - 如何将 css 类转换为样式化组件
- java - 不接收来自数据库的更新数据(Spring OneToMany 关系)
- python-3.x - 如何将输出转换为带有索引的新表?蟒蛇3