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

时间:2020-04-06 18:56:55

标签: react-native

我已经分叉了这个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) 在提供程序中(在App.js:8) 在App中(在renderApplication.js:40) 在RCTView中(位于AppContainer.js:101) 在RCTView中(位于AppContainer.js:119)

我一直在高低搜寻有关可能导致错误的软件包的任何线索,我只能看到报告的与react-native-device-info相关的问题,但这并没有引起问题。错误是什么意思?如果周围只有很少的信息,我该如何开始调试它?

2 个答案:

答案 0 :(得分:1)

这是临时修复。这在我这边工作得很好。你必须编辑这个文件

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

答案 1 :(得分:0)

该错误仅在 DEV 中显示。您可以通过编辑以下文件来删除它:

node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js

并注释掉抛出的错误如下:

  callNativeSyncHook(
    moduleID: number,
    methodID: number,
    params: any[],
    onFail: ?Function,
    onSucc: ?Function,
  ): any {
    //if (__DEV__) {
    //  invariant(
    //    global.nativeCallSyncHook,
    //    'Calling synchronous methods on native ' +
    //      'modules is not supported in Chrome.\n\n Consider providing alternative ' +
    //      'methods to expose this method in debug mode, e.g. by exposing constants ' +
    //      'ahead-of-time.',
    //  );
    //}
    this.processCallbacks(moduleID, methodID, params, onFail, onSucc);
    return global.nativeCallSyncHook(moduleID, methodID, params);
  }

这将解决问题,直到有人修复 react-native 中的 underlaying issue