React Native 不变违例:Chrome不支持在本机模块上调用同步方法

xyhw6mcr  于 2023-10-22  发布在  React
关注(0)|答案(4)|浏览(174)

我已经将这个React库分叉,用于React Native,并通过安装react-native-svguse-elapsed-time和prop-types来使其工作:
https://github.com/vydimitrov/react-countdown-circle-timer
但是我现在无法使用调试器:
不变违例:Chrome不支持在本机模块上调用同步方法。
考虑提供替代方法以在调试模式下公开此方法,例如:通过提前暴露常数。
此错误位于:在CountdownCircleTimer(在AppRoot.js:118)在AppRoot(在App.js:9)在Provider(在App.js:8)在App(在renderApplication.js:40)在RCTView(在AppContainer. js:101)在RCTView(在AppContainer. js:119)中
我已经搜索了高和低的任何线索,哪个包可能会导致错误,我只能看到报告的问题有关react-native-device-info,但这并不是导致问题。这个错误意味着什么?如果关于它的信息如此之少,我如何开始调试它?

inb24sb2

inb24sb21#

这是暂时的修复。这在我这边很有效你必须编辑这个文件
node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js

callNativeSyncHook(
    moduleID: number,
    methodID: number,
    params: any[],
    onFail: ?Function,
    onSucc: ?Function,
  ): any {
    const isDebuggingEnabled = (typeof atob !== 'undefined');
    this.processCallbacks(moduleID, methodID, params, onFail, onSucc);
    if(!isDebuggingEnabled)
    {
      return global.nativeCallSyncHook(moduleID, methodID, params);
    }
  }

您也可以使用patch-package永久修补它。
underlaying issue

doinxwow

doinxwow2#

对于任何其他从谷歌搜索登陆这里的人来说,自2011年以来,这个问题似乎发生了很大的变化(这并不奇怪)。
如果你尝试@ madNuman的解决方案,你会得到一个关于global.nativeCallSyncHook不是函数的错误。
我使用的解决方法是简单地返回callNativeSyncHook中的任何其他内容。例如:

callNativeSyncHook(
    moduleID: number,
    methodID: number,
    params: any[],
    onFail: ?Function,
    onSucc: ?Function,
): any {
    const isDebuggingEnabled = (typeof atob !== 'undefined');
    this.processCallbacks(moduleID, methodID, params, onFail, onSucc);
    if (!isDebuggingEnabled) {
        return "Meh, I have no idea what's going on here, but at least this gets rid of the annoying error!";
    }
}

我很想知道是否有一个“适当”的方法来解决这个问题后2011年,但现在这对我来说已经足够好了。

dba5bblo

dba5bblo3#

我使用RN 0.67.3。此错误是在调试模式下的Galaxy S22中发现的。我打开了yarn android,错误消失了。

cx6n0qe3

cx6n0qe34#

尝试强制启用远程调试

import NativeDevSettings from 'react-native/Libraries/NativeModules/specs/NativeDevSettings';
export default function App() {
  useEffect(() => {
    NativeDevSettings.setIsDebuggingRemotely(true);
  }, []);

  return <MyApp />;
}

相关问题