在 Swift 中实现 RCTEventEmitter 但未设置桥接收异常

2023-11-27

我正在尝试在 Swift 中实现 React Native 的事件发射器,以便我可以在我的一些本机模块中重用它。但是,当我从 iOS 本地发送事件时,收到以下错误

Bridge is not set. This is probably because you've explicitly synthesized the bridge in MyEventEmitter, even though it's inherited from RCTEventEmitter.
/// MyEventEmitter.m
#import <Foundation/Foundation.h>
#import <React/RCTBridgeModule.h>
#import <React/RCTEventEmitter.h>

@interface RCT_EXTERN_MODULE(MyEventEmitter, RCTEventEmitter)

RCT_EXTERN_METHOD(supportedEvents)

@end

Swift 中的实现:

import Foundation

@objc(MyEventEmitter)
class MyEventEmitter: RCTEventEmitter {

    public static let shared = MyEventEmitter()

    override func supportedEvents() -> [String]! {
        return [
            ... // my event list
        ]
    }
}

在我的本机 swift 代码中,我通过以下方式初始化了发射器

private let eventEmitter: MyEventEmitter = .shared

// send event
self.eventEmitter.sendEvent(withName: "someEvent", body: nil)

我也把<React/RCTBridgeModule.h> and <React/RCTEventEmitter.h>在我的桥接头内。

我在这里做错了什么?


我发现的问题是你不能实例化MyEventEmitter你自己又名在public static let shared = MyEventEmitter()

你应该覆盖init方法和分配self to shared

import Foundation

@objc(MyEventEmitter)
class MyEventEmitter: RCTEventEmitter {

    public static var shared:MyEventEmitter?

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

    override func supportedEvents() -> [String]! {
        return [
            ... // my event list
        ]
    }
}

这是因为 RN 已经实例化了对象本身并分配了桥,而当您自己执行此操作时,桥将不会被分配。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Swift 中实现 RCTEventEmitter 但未设置桥接收异常 的相关文章

随机推荐