gpt4 book ai didi

javascript - react native (RCT_REMAP_METHOD): How to export a method with a parameter and return value?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:53:53 27 4
gpt4 key购买 nike

我正在尝试在 React Native 中使用 gRPC。首先,我能够使用 Objective-C 设置我的 gRPC 模块。接下来,我为该 gRPC 模块制作了一个 native 模块。

gRPC 模块非常简单。

rpc CheckEmail(EmailCheckRequest) returns (EmailCheckResponse) {}

message EmailCheckRequest {
string email = 1;
}

message EmailCheckResponse {
common.RetCode ret = 1;
}

如您所见,有一个输入参数(电子邮件地址)并返回一个“返回代码”。

我在 https://facebook.github.io/react-native/docs/native-modules-ios.html 查看了如何制作 native 模块它展示了如何制作一个带有参数的模块或一个带有返回值的模块,但它没有解释如何制作一个同时包含两者的模块。

这里是例子。

带有参数的模块

RCT_EXPORT_METHOD(addEvent:(NSString *)name)
{
RCTLogInfo(@"Pretending to create an event %@", name);
}

有返回值的模块(其实是有Promise的)

RCT_REMAP_METHOD(findEvents,
findEventsWithResolver:(RCTPromiseResolveBlock)resolve
rejecter:(RCTPromiseRejectBlock)reject)
{
NSArray *events = ...
if (events) {
resolve(events);
} else {
NSError *error = ...
reject(@"no_events", @"There were no events", error);
}
}

反正我是基于这个,自己写的代码是这样的。

RCT_REMAP_METHOD(checkEmail: (NSString *)email, resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
{
/* ... */
}

而react-native端的javascript代码是这样的。 var NetworkService = NativeModules.NetworkService; var ret = NetworkService.checkEmail('spike@merong.com');

没有编译错误,但在运行应用程序时,XCode 在 RCT_REMAP_METHOD 行返回此运行时错误“com.facebook.React.JavaScript (11):EXC_BAD_ACCESS(code=1, address=0x88)

RCT_REMAP_METHOD 宏看起来有问题,但不知道 Objective-C 的细节,也不知道如何使用 marco。

如果有人知道如何使用 RCT_REMAP_METHOD 宏来导出带有参数和返回值的模块,或者如果我的代码有问题,请告诉我。

其他发现我遵循了 RCT_REMAP_METHOD 的定义,似乎可以改用 RCT_EXPORT_METHOD,因为 EXPORT 是 REMAP 的重新定义,并且有一个 Promises with EXPORT 的示例,但不确定这样做是否正确。

* ## Promises
*
* Bridge modules can also define methods that are exported to JavaScript as
* methods that return a Promise, and are compatible with JS async functions.
*
* Declare the last two parameters of your native method to be a resolver block
* and a rejecter block. The resolver block must precede the rejecter block.
*
* For example:
*
* RCT_EXPORT_METHOD(doSomethingAsync:(NSString *)aString
* resolver:(RCTPromiseResolveBlock)resolve
* rejecter:(RCTPromiseRejectBlock)reject
* { ... }
*
* Calling `NativeModules.ModuleName.doSomethingAsync(aString)` from
* JavaScript will return a promise that is resolved or rejected when your
* native method implementation calls the respective block.
*
*/

最佳答案

RCT_EXPORT_METHOD 只是将js函数重新映射到native函数。当多个 native 方法在第一个冒号之前相同并且 JavaScript 名称有冲突时,这很有用。

定义RCT_REMAP_METHOD(js_name, method)js_name表示js代码调用的函数,method表示native函数姓名。

所以如果你想导出一个带有参数(或更多)的方法,你可以这样做:

// Bridge.m

RCT_EXPORT_MODULE(Bridge)

RCT_REMAP_METHOD(findEvents,
type:(NSString *)type
params:(NSDictionary *)params
findEventsWithResolver:(RCTPromiseResolveBlock)resolve
rejecter:(RCTPromiseRejectBlock)reject)
{ ... }

然后从js代码中调用函数如下:

const Bridge = NativeModules.Bridge;

class App extends Component {
asnyc _buttonPress() {
try {
let result = await Bridge.findEvents("type", {"key": "value"});
// handle the result
} catch(e) {
// handle the error
}
}
}

Make sure the RCTPromiseResolveBlock and RCTPromiseRejectBlock are the last two parameters.

关于javascript - react native (RCT_REMAP_METHOD): How to export a method with a parameter and return value?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45099173/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com