首页 > 解决方案 > 在 Swift 中实现 RCTEventEmitter 但未设置桥接异常

问题描述

我正在尝试在 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>放在我的桥接头中。

我在这里做错了什么?

标签: objective-cswiftreact-native

解决方案


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

您应该重写该init方法并分配selfshared

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 将已经实例化对象本身并分配桥,而当您自己这样做时,桥不会被分配。


推荐阅读