From e386138bbd3a66cd6d3ea8b47fecda20e2ff522a Mon Sep 17 00:00:00 2001 From: Samuel Susla Date: Wed, 3 Apr 2024 11:13:10 -0700 Subject: [PATCH] only trigger RCTContentDidAppearNotification when content appears Summary: changelog: [internal] Notification RCTContentDidAppearNotification was posted too early in RCTSurfaceHostingProxyRootView, which does not know when views are mounted. It was also posted if no views were mounted, leading to inconsistent behaviour between Paper and Fabric. The implementation is aligned with Paper: https://fburl.com/code/xa3byys6 Differential Revision: D55640654 --- .../RCTSurfaceHostingProxyRootView.mm | 3 --- .../Root/RCTRootComponentView.mm | 23 ++++++++++++++++++- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/packages/react-native/React/Base/Surface/SurfaceHostingView/RCTSurfaceHostingProxyRootView.mm b/packages/react-native/React/Base/Surface/SurfaceHostingView/RCTSurfaceHostingProxyRootView.mm index 670c02299601ec..39377fe8b6f846 100644 --- a/packages/react-native/React/Base/Surface/SurfaceHostingView/RCTSurfaceHostingProxyRootView.mm +++ b/packages/react-native/React/Base/Surface/SurfaceHostingView/RCTSurfaceHostingProxyRootView.mm @@ -125,9 +125,6 @@ - (void)surface:(RCTSurface *)surface didChangeStage:(RCTSurfaceStage)stage [super surface:surface didChangeStage:stage]; if (RCTSurfaceStageIsRunning(stage)) { [_bridge.performanceLogger markStopForTag:RCTPLTTI]; - dispatch_async(dispatch_get_main_queue(), ^{ - [[NSNotificationCenter defaultCenter] postNotificationName:RCTContentDidAppearNotification object:self]; - }); } } diff --git a/packages/react-native/React/Fabric/Mounting/ComponentViews/Root/RCTRootComponentView.mm b/packages/react-native/React/Fabric/Mounting/ComponentViews/Root/RCTRootComponentView.mm index eb81a151c3fc41..c7d0a525a9ac74 100644 --- a/packages/react-native/React/Fabric/Mounting/ComponentViews/Root/RCTRootComponentView.mm +++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/Root/RCTRootComponentView.mm @@ -7,18 +7,22 @@ #import "RCTRootComponentView.h" +#import #import #import #import "RCTConversions.h" using namespace facebook::react; -@implementation RCTRootComponentView +@implementation RCTRootComponentView { + BOOL _contentHasAppeared; +} - (instancetype)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { _props = RootShadowNode::defaultSharedProps(); + _contentHasAppeared = NO; } return self; @@ -26,6 +30,23 @@ - (instancetype)initWithFrame:(CGRect)frame #pragma mark - RCTComponentViewProtocol +- (void)prepareForRecycle +{ + [super prepareForRecycle]; + _contentHasAppeared = NO; +} + +- (void)mountChildComponentView:(UIView *)childComponentView index:(NSInteger)index +{ + [super mountChildComponentView:childComponentView index:index]; + if (!self->_contentHasAppeared) { + self->_contentHasAppeared = YES; + dispatch_async(dispatch_get_main_queue(), ^{ + [[NSNotificationCenter defaultCenter] postNotificationName:RCTContentDidAppearNotification object:self]; + }); + } +} + + (ComponentDescriptorProvider)componentDescriptorProvider { return concreteComponentDescriptorProvider();