我正在按照此處的指南在 React Native 中創建 Turbo 模塊。 https://reactnative.dev/docs/next/the-new-architecture/pillars-turbomodules
你如何在 iOS 上發出事件?該檔案僅顯示如何從 React 呼叫本機函式,而不是如何從 Turbo 模塊發出事件。
對于 Android,您會獲得一個ReactApplicationContext物件,它允許您使用背景關系物件創建像這樣的發射器。
private val emitter = context.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
emitter.emit(eventName, eventArray)
你如何在 iOS 上做同樣的事情?
uj5u.com熱心網友回復:
要從 iOS 向 RN 發出事件,您應該創建自己的發射器類,該發射器類繼承自RCTEventEmitter,然后在 JS 端初始化它,NativeEventEmitter并為所需事件添加偵聽器addListener:
事件發射器.h
#import <React/RCTEventEmitter.h>
@interface EventEmitter : RCTEventEmitter
(instancetype)shared;
@end
事件發射器.m
#import "EventEmitter.h"
// Events
static NSString* onMyEvent = @"onMyEvent";
// Variable to save the instance
static EventEmitter* eventEmitter = nil;
@implementation EventEmitter
/// Exposing "EventEmitter" name to RN
RCT_EXPORT_MODULE(EventEmitter);
// Called from RN
- (instancetype)init {
if (self = [super init]) {
eventEmitter = self;
}
return self;
}
(BOOL)requiresMainQueueSetup {
return NO;
}
(instancetype)shared {
return eventEmitter;
}
// List of supported events
- (NSArray<NSString *> *)supportedEvents {
return @[onMyEvent];
}
@end
如何呼叫:
NSDictionary* body = @{@"message" : @"Hello Emitter!"};
[EventEmitter.shared sendEventWithName:@"onMyEvent" body:body];
注冊護士/JS
import {
...
NativeEventEmitter,
NativeModules,
} from 'react-native';
import type EmitterSubscription from 'react-native';
class EventHandler extends React.Component {
eventsSubscription: EmitterSubscription;
componentDidMount() {
const eventEmitter = new NativeEventEmitter(NativeModules.EventEmitter);
this.eventsSubscription = eventEmitter.addListener('onMyEvent', event => {
console.log(event.message); // Prints "Hello Emitter!"
});
}
componentWillUnmount() {
this.eventsSubscription.remove();
}
...
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/522279.html
