iOS新手技术求助:从原生ViewController向React Native发送事件时遭遇Bridge未设置错误
解决RCTEventEmitter "Bridge is not set" 错误的方案
嘿,我来帮你搞定这个问题!你遇到的核心问题很明确:你在Connect ViewController里手动创建了Brygga的新实例let event: brygga = Brygga(),但这个实例并没有被React Native框架初始化,所以它的bridge属性是nil,自然会抛出那个错误。
RCTEventEmitter的实例是由RN框架负责管理和初始化的,框架会在初始化时自动给它绑定bridge,我们不能自己new一个来用。下面是具体的修复步骤:
1. 给Brygga类添加单例属性
修改你的Brygga类,添加一个静态单例属性,这样我们就能拿到RN框架已经初始化好的那个实例:
@objc(Brygga) class Brygga: RCTEventEmitter { // 静态单例,保存框架初始化的实例 static var shared: Brygga? override init() { super.init() // 在初始化时把自己赋值给单例 Brygga.shared = self } @objc func Finished(data: String) { sendEvent(withName: "onFinished", body: ["data": data]) } override func supportedEvents() -> [String]! { return ["onFinished"] } override static func requiresMainQueueSetup() -> Bool { return true } }
2. 修改Connect类中的事件发送逻辑
在Connect的didFinishWithResults方法里,不要创建新的Brygga实例,而是调用我们刚才设置的单例:
func didFinishWithResults(resultsDictionary: [String : Any]) { // 使用单例调用方法,而不是手动初始化 Brygga.shared?.Finished(data: "Hello") }
3. 修正Objective-C桥接文件的方法签名
你的Brygga.m里的RCT_EXTERN_METHOD没有匹配Swift方法的参数,需要修正:
@interface RCT_EXTERN_MODULE(Brygga, RCTEventEmitter) // 加上参数类型,和Swift方法对应 RCT_EXTERN_METHOD(Finished:(NSString *)data) @end
4. React Native端监听事件(补充)
最后别忘了在RN代码里监听这个事件,确保能收到原生发来的数据:
import { NativeEventEmitter, NativeModules } from 'react-native'; const { Brygga } = NativeModules; const bryggaEmitter = new NativeEventEmitter(Brygga); // 订阅事件 const eventSubscription = bryggaEmitter.addListener( 'onFinished', (event) => { console.log('收到原生数据:', event.data); // 这里处理你的业务逻辑 } ); // 组件卸载时一定要取消订阅,避免内存泄漏 // useEffect(() => { // return () => { // eventSubscription.remove(); // }; // }, []);
为什么这个方案有效?
当RN启动时,会自动初始化所有注册的Native模块(包括你的Brygga),这时候框架会给它设置好bridge属性。我们通过单例保存这个初始化好的实例,就能在ViewController里安全地调用它的方法发送事件,而不会出现bridge未设置的问题。
内容的提问来源于stack exchange,提问作者Crystalii
相关产品推荐
相关产品推荐

