React Native Web添加Stack.Navigator后出现Context相关报错求助
嘿,我之前也踩过这个坑!你遇到的这个Context报错,根源其实特别明确——你在Webpack配置里把react-native-safe-area-context给mock掉了,但代码里又实实在在在使用这个库的SafeAreaProvider组件,mock文件肯定没有实现对应的Context逻辑,自然就会抛出这个上下文未定义的错误啦。iOS端正常是因为iOS环境下你没启用这个mock,用的是真实的库文件。
给你两个针对性的解决方案,按需选择就行:
方案一:移除Mock,使用真实库(推荐)
这是最稳妥的解决方式,毕竟你代码里确实需要这个库的功能:
- 先确保已经安装了适配Web的
react-native-safe-area-context:
npm install react-native-safe-area-context # 或者用yarn yarn add react-native-safe-area-context
- 打开你的
webpack.config.js,删掉这段alias配置:
'react-native-safe-area-context': path.resolve( __dirname, './react-native-safe-area-context.mock.js' ),
这样Webpack就会加载真实的库文件,SafeAreaProvider对应的Context就能正常工作了。
方案二:如果必须Mock,补全Context实现
如果你因为某些特殊原因一定要用Mock,那你的react-native-safe-area-context.mock.js必须实现最基础的Context结构,不能是空的或者缺失Context定义。比如可以这么写:
import React, { createContext, useContext } from 'react'; // 创建基础的安全区域上下文 const SafeAreaContext = createContext({ insets: { top: 0, right: 0, bottom: 0, left: 0 }, }); // 实现SafeAreaProvider组件 export const SafeAreaProvider = ({ children }) => { return ( <SafeAreaContext.Provider value={{ insets: { top: 0, right: 0, bottom: 0, left: 0 } }}> {children} </SafeAreaContext.Provider> ); }; // 可选:如果用到useSafeAreaInsets钩子也一并mock export const useSafeAreaInsets = () => useContext(SafeAreaContext).insets;
这个mock版本能提供最基础的上下文,至少不会再报Context相关的错误,但它不会计算真实的安全区域,适合只需要占位的场景。
另外再提个小建议:可以检查一下@react-navigation/native、@react-navigation/native-stack和react-native-web的版本兼容性,偶尔版本不匹配也会触发这类奇怪的上下文问题,尽量用最新的稳定版哦~
备注:内容来源于stack exchange,提问作者NooZ Production
相关产品推荐
相关产品推荐

