Tengo esta clase Swift, la función emitLogEvent llama a RCTEventEmitter sendEvent que se está escuchando en React Native. Si llamo a esta función directamente desde React, el evento de envío funciona y puedo cerrar sesión en 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] } }
Si introduzco otra clase simple con una función que llama a emitLogEvent
import Foundation @objc(TestMe) class TestMe: NSObject { @objc func runTest() { print(200) let emitter = NativeGlobalEventEmitter() emitter.emitLogEvent(); } }
Y luego llame a runTest() desde React Native, se imprime 200 pero aparece el error
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 ( )
¿Por qué estaría pasando esto? Puedo llamar a cualquiera de las funciones directamente y funcionan, pero llamar a una función que emite un evento de otra clase provoca el error.
Encontré la solución aquí .
Este problema con esto es:
func runTest() { print(200) let emitter = NativeGlobalEventEmitter() emitter.emitLogEvent(); }
Crear una instancia de NativeGlobalEventEmitter. Esto se debe a que RN ya creó el objeto y lo asignó al puente.
En su lugar, anula init() y establece una propiedad en la clase
public static var shared: NativeGlobalEventEmitter? override init() { super.init() NativeGlobalEventEmitter.shared = self }
Entonces puedes usarlo así
NativeGlobalEventEmitter.shared?.emitLogEvent()