You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native Web添加Stack.Navigator后出现Context相关报错求助

React Native Web添加Stack.Navigator后出现Context相关报错求助

嘿,我之前也踩过这个坑!你遇到的这个Context报错,根源其实特别明确——你在Webpack配置里把react-native-safe-area-context给mock掉了,但代码里又实实在在在使用这个库的SafeAreaProvider组件,mock文件肯定没有实现对应的Context逻辑,自然就会抛出这个上下文未定义的错误啦。iOS端正常是因为iOS环境下你没启用这个mock,用的是真实的库文件。

给你两个针对性的解决方案,按需选择就行:

方案一:移除Mock,使用真实库(推荐)

这是最稳妥的解决方式,毕竟你代码里确实需要这个库的功能:

  1. 先确保已经安装了适配Web的react-native-safe-area-context:
npm install react-native-safe-area-context
# 或者用yarn
yarn add react-native-safe-area-context
  1. 打开你的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 18:03:12