objective-c - 在 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>
放在我的桥接头中。
我在这里做错了什么?
解决方案
我发现的问题是你不能实例化MyEventEmitter
你自己public static let shared = MyEventEmitter()
您应该重写该init
方法并分配self
给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 将已经实例化对象本身并分配桥,而当您自己这样做时,桥不会被分配。
推荐阅读
- android - AirBnb Epoxy - 视图被复制而不是被替换
- hyperledger-fabric - 为什么我们不将锚节点放在第一次生成的通道配置中?
- node.js - 为什么 Electron 快速启动应用程序无法在我的 Ubuntu 实例上正确启动?
- java - android studio:java.lang.VerifyError:拒绝尝试子类型错误类java.awt.geom.Point2D的类java.awt.Point
- swiftui - Apple 建议的 .indexed() 属性如何在 ForEach 中工作?
- node.js - 如何总结一个月每天一条记录?
- terraform - Terraform azurerm_api_management_api 颠簸修订不应用所有必需的更改
- javascript - 如何在javascript中获取文件内容?
- typescript - Electron、TypeScript、绝对路径和最佳实践
- sql - 在 SQL 中生成随机数之前从未使用过