diff --git a/React/Modules/RCTUIManager.m b/React/Modules/RCTUIManager.m index 47399cc691..fddcb5ce7c 100644 --- a/React/Modules/RCTUIManager.m +++ b/React/Modules/RCTUIManager.m @@ -167,7 +167,9 @@ RCT_EXPORT_MODULE() _componentDataByName = [NSMutableDictionary new]; for (Class moduleClass in _bridge.moduleClasses) { if ([moduleClass isSubclassOfClass:[RCTViewManager class]]) { - RCTComponentData *componentData = [[RCTComponentData alloc] initWithManagerClass:moduleClass bridge:_bridge]; + RCTComponentData *componentData = [[RCTComponentData alloc] initWithManagerClass:moduleClass + bridge:_bridge + eventDispatcher:_bridge.eventDispatcher]; _componentDataByName[componentData.name] = componentData; } } @@ -1577,7 +1579,9 @@ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(lazilyLoadView : (NSString *)name) return @{}; } - RCTComponentData *componentData = [[RCTComponentData alloc] initWithManagerClass:[module class] bridge:self.bridge]; + RCTComponentData *componentData = [[RCTComponentData alloc] initWithManagerClass:[module class] + bridge:self.bridge + eventDispatcher:self.bridge.eventDispatcher]; _componentDataByName[componentData.name] = componentData; NSMutableDictionary *directEvents = [NSMutableDictionary new]; NSMutableDictionary *bubblingEvents = [NSMutableDictionary new]; diff --git a/React/Views/RCTComponentData.h b/React/Views/RCTComponentData.h index 90c67856a9..6a1fdb7a2f 100644 --- a/React/Views/RCTComponentData.h +++ b/React/Views/RCTComponentData.h @@ -14,6 +14,7 @@ @class RCTBridge; @class RCTShadowView; @class UIView; +@class RCTEventDispatcherProtocol; NS_ASSUME_NONNULL_BEGIN @@ -29,7 +30,9 @@ NS_ASSUME_NONNULL_BEGIN */ @property (nonatomic, strong, readonly) RCTViewManager *bridgelessViewManager; -- (instancetype)initWithManagerClass:(Class)managerClass bridge:(RCTBridge *)bridge NS_DESIGNATED_INITIALIZER; +- (instancetype)initWithManagerClass:(Class)managerClass + bridge:(RCTBridge *)bridge + eventDispatcher:(id)eventDispatcher NS_DESIGNATED_INITIALIZER; - (UIView *)createViewWithTag:(nullable NSNumber *)tag rootTag:(nullable NSNumber *)rootTag; - (RCTShadowView *)createShadowViewWithTag:(NSNumber *)tag; diff --git a/React/Views/RCTComponentData.m b/React/Views/RCTComponentData.m index 2e013112fb..5819e4d1f9 100644 --- a/React/Views/RCTComponentData.m +++ b/React/Views/RCTComponentData.m @@ -13,6 +13,7 @@ #import "RCTBridgeModule.h" #import "RCTComponentEvent.h" #import "RCTConvert.h" +#import "RCTEventDispatcherProtocol.h" #import "RCTParserUtils.h" #import "RCTShadowView.h" #import "RCTUtils.h" @@ -36,15 +37,19 @@ static SEL selectorForType(NSString *type) RCTPropBlockDictionary *_viewPropBlocks; RCTPropBlockDictionary *_shadowPropBlocks; __weak RCTBridge *_bridge; + __weak id _eventDispatcher; } @synthesize manager = _manager; @synthesize bridgelessViewManager = _bridgelessViewManager; -- (instancetype)initWithManagerClass:(Class)managerClass bridge:(RCTBridge *)bridge +- (instancetype)initWithManagerClass:(Class)managerClass + bridge:(RCTBridge *)bridge + eventDispatcher:(id)eventDispatcher { if ((self = [super init])) { _bridge = bridge; + _eventDispatcher = eventDispatcher; _managerClass = managerClass; _viewPropBlocks = [NSMutableDictionary new]; _shadowPropBlocks = [NSMutableDictionary new]; @@ -104,10 +109,13 @@ RCT_NOT_IMPLEMENTED(-(instancetype)init) } } -static RCTPropBlock -createEventSetter(NSString *propName, SEL setter, InterceptorBlock eventInterceptor, RCTBridge *bridge) +static RCTPropBlock createEventSetter( + NSString *propName, + SEL setter, + InterceptorBlock eventInterceptor, + id eventDispatcher) { - __weak RCTBridge *weakBridge = bridge; + __weak id weakEventDispatcher = eventDispatcher; return ^(id target, id json) { void (^eventHandler)(NSDictionary *event) = nil; if ([RCTConvert BOOL:json]) { @@ -125,7 +133,7 @@ createEventSetter(NSString *propName, SEL setter, InterceptorBlock eventIntercep RCTComponentEvent *componentEvent = [[RCTComponentEvent alloc] initWithName:propName viewTag:strongTarget.reactTag body:event]; - [weakBridge.eventDispatcher sendEvent:componentEvent]; + [weakEventDispatcher sendEvent:componentEvent]; } }; } @@ -254,7 +262,8 @@ static RCTPropBlock createNSInvocationSetter(NSMethodSignature *typeSignature, S if (type == NSSelectorFromString(@"RCTBubblingEventBlock:") || type == NSSelectorFromString(@"RCTDirectEventBlock:")) { // Special case for event handlers - setterBlock = createEventSetter(name, setter, self.eventInterceptor, _bridge); + setterBlock = + createEventSetter(name, setter, self.eventInterceptor, _bridge ? _bridge.eventDispatcher : _eventDispatcher); } else { // Ordinary property handlers NSMethodSignature *typeSignature = [[RCTConvert class] methodSignatureForSelector:type]; diff --git a/ReactCommon/react/renderer/components/legacyviewmanagerinterop/LegacyViewManagerInteropComponentDescriptor.mm b/ReactCommon/react/renderer/components/legacyviewmanagerinterop/LegacyViewManagerInteropComponentDescriptor.mm index 3c6648d8fc..534c3bb495 100644 --- a/ReactCommon/react/renderer/components/legacyviewmanagerinterop/LegacyViewManagerInteropComponentDescriptor.mm +++ b/ReactCommon/react/renderer/components/legacyviewmanagerinterop/LegacyViewManagerInteropComponentDescriptor.mm @@ -8,6 +8,7 @@ #include "LegacyViewManagerInteropComponentDescriptor.h" #include #include +#include #include #include #include @@ -64,8 +65,16 @@ static std::shared_ptr const constructCoordinator( if (optionalBridge) { bridge = unwrapManagedObjectWeakly(optionalBridge.value()); } + + auto optionalEventDispatcher = contextContainer->find>("RCTEventDispatcher"); + RCTEventDispatcher *eventDispatcher; + if (optionalEventDispatcher) { + eventDispatcher = unwrapManagedObject(optionalEventDispatcher.value()); + } + RCTComponentData *componentData = [[RCTComponentData alloc] initWithManagerClass:module - bridge:bridge]; + bridge:bridge + eventDispatcher:eventDispatcher]; return wrapManagedObject([[RCTLegacyViewManagerInteropCoordinator alloc] initWithComponentData:componentData bridge:bridge]); }