File tree 5 files changed +31
-1
lines changed
Mounting/ComponentViews/ScrollView
ReactCommon/react/renderer/core
5 files changed +31
-1
lines changed Original file line number Diff line number Diff line change @@ -23,6 +23,12 @@ RCT_EXTERN void RCTExperimentSetOnDemandViewMounting(BOOL value);
23
23
RCT_EXTERN BOOL RCTExperimentGetSendScrollEventToPaper (void );
24
24
RCT_EXTERN void RCTExperimentSetSendScrollEventToPaper (BOOL value);
25
25
26
+ /*
27
+ * Enables a fix for data race between state and scroll event.
28
+ */
29
+ RCT_EXTERN BOOL RCTExperimentGetScrollViewEventRaceFix (void );
30
+ RCT_EXTERN void RCTExperimentSetScrollViewEventRaceFix (BOOL value);
31
+
26
32
/*
27
33
* Preemptive View Allocation
28
34
*/
Original file line number Diff line number Diff line change @@ -40,6 +40,21 @@ void RCTExperimentSetSendScrollEventToPaper(BOOL value)
40
40
RCTExperimentSendScrollEventToPaper = value;
41
41
}
42
42
43
+ /*
44
+ * Enable fix for data race between state and scroll event.
45
+ */
46
+ static BOOL RCTExperimentScrollViewEventRaceFix = NO ;
47
+
48
+ BOOL RCTExperimentGetScrollViewEventRaceFix ()
49
+ {
50
+ return RCTExperimentScrollViewEventRaceFix;
51
+ }
52
+
53
+ void RCTExperimentSetScrollViewEventRaceFix (BOOL value)
54
+ {
55
+ RCTExperimentScrollViewEventRaceFix = value;
56
+ }
57
+
43
58
/*
44
59
* Preemptive View Allocation
45
60
*/
Original file line number Diff line number Diff line change @@ -88,6 +88,7 @@ @implementation RCTScrollViewComponentView {
88
88
89
89
BOOL _isOnDemandViewMountingEnabled;
90
90
BOOL _sendScrollEventToPaper;
91
+ BOOL _enableScrollViewEventRaceFix;
91
92
CGPoint _contentOffsetWhenClipped;
92
93
NSMutableArray <UIView<RCTComponentViewProtocol> *> *_childComponentViews;
93
94
}
@@ -108,6 +109,7 @@ - (instancetype)initWithFrame:(CGRect)frame
108
109
109
110
_isOnDemandViewMountingEnabled = RCTExperimentGetOnDemandViewMounting ();
110
111
_sendScrollEventToPaper = RCTExperimentGetSendScrollEventToPaper ();
112
+ _enableScrollViewEventRaceFix = RCTExperimentGetScrollViewEventRaceFix ();
111
113
_childComponentViews = [[NSMutableArray alloc ] init ];
112
114
113
115
_scrollView = [[RCTEnhancedScrollView alloc ] initWithFrame: self .bounds];
@@ -417,6 +419,9 @@ - (void)scrollViewDidScroll:(UIScrollView *)scrollView
417
419
if ((_lastScrollEventDispatchTime == 0 ) || (now - _lastScrollEventDispatchTime > _scrollEventThrottle)) {
418
420
_lastScrollEventDispatchTime = now;
419
421
if (_eventEmitter) {
422
+ if (_enableScrollViewEventRaceFix) {
423
+ [self _updateStateWithContentOffset ];
424
+ }
420
425
std::static_pointer_cast<ScrollViewEventEmitter const >(_eventEmitter)->onScroll ([self _scrollViewMetrics ]);
421
426
}
422
427
// Once Fabric implements proper NativeAnimationDriver, this should be removed.
Original file line number Diff line number Diff line change @@ -261,6 +261,10 @@ - (RCTScheduler *)_createScheduler
261
261
RCTExperimentSetSendScrollEventToPaper (NO );
262
262
}
263
263
264
+ if (reactNativeConfig && reactNativeConfig->getBool (" react_fabric:enable_state_scroll_data_race_ios" )) {
265
+ RCTExperimentSetScrollViewEventRaceFix (YES );
266
+ }
267
+
264
268
if (reactNativeConfig && reactNativeConfig->getBool (" react_fabric:preemptive_view_allocation_disabled_ios" )) {
265
269
RCTExperimentSetPreemptiveViewAllocationDisabled (YES );
266
270
}
Original file line number Diff line number Diff line change @@ -77,8 +77,8 @@ void EventQueue::enqueueStateUpdate(StateUpdate &&stateUpdate) const {
77
77
}
78
78
79
79
void EventQueue::onBeat (jsi::Runtime &runtime) const {
80
- flushEvents (runtime);
81
80
flushStateUpdates ();
81
+ flushEvents (runtime);
82
82
}
83
83
84
84
void EventQueue::flushEvents (jsi::Runtime &runtime) const {
You can’t perform that action at this time.
0 commit comments