为什么 React Native/Objective-C 抱怨我使用错误数量的参数调用我的方法?

Mic*_*fer 1 objective-c ios swift react-native

我正在使用 Objective-C 和 Swift 开发 React Native 应用程序。

目前,我正在尝试使用使用 Promise 的更优雅的解决方案来替换当前使用 EventEmitter 的方法。

但是,我遇到了一些麻烦,因为我收到编译器/解释器的投诉,说我使用错误数量的参数调用我的方法:

ExceptionsManager.js:71 RecorderBridge.startRecording was called with 0 arguments but expects 1 arguments. If you haven't changed this method yourself, this usually means that your versions of the native code and JavaScript code are out of sync. Updating both should make this error go away.

然而,除了解析器和拒绝器之外,我实际上没有任何参数,编译器/解释器不应该抱怨它们。

我的代码如下所示:

记录器.js

...
startRecording = () => {
  RecorderNative.startRecording();
};
...
Run Code Online (Sandbox Code Playgroud)

RecorderNativeModule.js

import { NativeModules } from 'react-native';

const { RecorderBridge } = NativeModules;

export default {
  startRecording() {
    return RecorderBridge.startRecording();
  }
}
Run Code Online (Sandbox Code Playgroud)

RecorderBridge.m

@implementation RecorderBridge 
  ...
  RCT_EXPORT_METHOD(startRecording: resolver:(RCTPromiseResolveBlock)resolve
                  rejecter:(RCTPromiseRejectBlock)reject) {
    BOOL result = [myRecorderViewController startRecording];

    if (result) {
      resolve();
    } else {
      reject();
    }
  }
 ...
@end
Run Code Online (Sandbox Code Playgroud)

RecorderController.swift

@objc open class RecorderViewController : UIViewController {
  @objc func startRecording() -> Bool {
    do {
      // Try to start recording
      try recorder.record();
      return true
    } catch {
      print("Errored recording.")
      return false
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

Art*_*tal 5

您导出的方法语法存在问题,实际上您需要一个参数,但您不会收到错误,因为它被传递给 RN 宏。在 Objective-C 中,你不标记第一个参数。

而不是这个:

RCT_EXPORT_METHOD(startRecording: resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
Run Code Online (Sandbox Code Playgroud)

它应该看起来像这样:

RCT_EXPORT_METHOD(startRecording:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
Run Code Online (Sandbox Code Playgroud)