gpt4 book ai didi

swift - React Native - 调用 native Swift 函数调用另一个触发 RCTEventEmiiter 发送事件的函数导致 RCTCallableJSModules 错误

转载 作者:行者123 更新时间:2023-12-05 05:45:37 24 4
gpt4 key购买 nike

我有这个 Swift 类,函数 emitLogEvent 调用 RCTEventEmitter sendEvent,它正在 React Native 中被监听。如果我直接从 React 调用此函数,sendEvent 会起作用,我可以从 React Native 注销计数。

import Foundation
import React

@objc(NativeGlobalEventEmitter)
class NativeGlobalEventEmitter: RCTEventEmitter {
@objc
func emitLogEvent() {
sendEvent(withName: "globalEvent", body: ["count": 1])
}

override func supportedEvents() -> [String]! {
return [
"globalEvent"
]
}

override static func requiresMainQueueSetup() -> Bool {
return true
}

override func constantsToExport() -> [AnyHashable : Any]! {
return ["initialCount": 0]
}
}

如果我引入另一个带有调用 emitLogEvent 函数的简单类

import Foundation
@objc(TestMe)
class TestMe: NSObject {
@objc
func runTest() {
print(200)
let emitter = NativeGlobalEventEmitter()
emitter.emitLogEvent();
}
}

然后从 React Native 调用 runTest(),打印了 200 但我得到了错误

Exception 'Error when sending event: globalEvent with body: {
count = 1;
}. RCTCallableJSModules is not set. This is probably because you've explicitly
synthesized the RCTCallableJSModules in NativeGlobalEventEmitter, even though it's
inherited from RCTEventEmitter.' was thrown while invoking runTest on target TestMe
with params (
)

为什么会这样?我可以直接调用任何函数并且它们可以工作,但是调用从另一个类发出事件的函数会导致错误

最佳答案

我找到了解决方案 here

这个问题是:

   func runTest() {
print(200)
let emitter = NativeGlobalEventEmitter()
emitter.emitLogEvent();
}

实例化 NativeGlobalEventEmitter 的实例。这是因为 RN 已经创建了对象并将其分配给网桥。

相反,覆盖 init() 并在类上设置一个属性

  public static var shared: NativeGlobalEventEmitter?

override init() {
super.init()
NativeGlobalEventEmitter.shared = self
}

然后你可以像这样使用它

   NativeGlobalEventEmitter.shared?.emitLogEvent()

关于swift - React Native - 调用 native Swift 函数调用另一个触发 RCTEventEmiiter 发送事件的函数导致 RCTCallableJSModules 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71302327/

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