From 5eac8ca9b05230b32a101db5336b1c996b97312e Mon Sep 17 00:00:00 2001 From: David Vacca Date: Tue, 30 Apr 2019 15:01:40 -0700 Subject: [PATCH] Migrate VirtualizedList to use ref.measureLayout Summary: This diff migrates VirtualizedList to use ref.measureLayout instead of UIManager.measureLayout, this is a pre-req to make measureLayout to work in Fabric Reviewed By: JoshuaGross, TheSavior Differential Revision: D14865762 fbshipit-source-id: 45dd3374813370188c914acfc7e631075508f74a --- Libraries/Components/ScrollView/ScrollView.js | 4 +++ Libraries/Lists/VirtualizedList.js | 33 ++++++++++++++----- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/Libraries/Components/ScrollView/ScrollView.js b/Libraries/Components/ScrollView/ScrollView.js index 37e951edb..a912662e6 100644 --- a/Libraries/Components/ScrollView/ScrollView.js +++ b/Libraries/Components/ScrollView/ScrollView.js @@ -730,6 +730,10 @@ class ScrollView extends React.Component { return ReactNative.findNodeHandle(this._innerViewRef); } + getNativeScrollRef(): ?ScrollView { + return this._scrollViewRef; + } + /** * Scrolls to a given x, y offset, either immediately or with a smooth animation. * diff --git a/Libraries/Lists/VirtualizedList.js b/Libraries/Lists/VirtualizedList.js index 573eb8c22..95ff01cfb 100644 --- a/Libraries/Lists/VirtualizedList.js +++ b/Libraries/Lists/VirtualizedList.js @@ -413,6 +413,14 @@ class VirtualizedList extends React.PureComponent { } } + getScrollRef() { + if (this._scrollRef && this._scrollRef.getScrollRef) { + return this._scrollRef.getScrollRef(); + } else { + return this._scrollRef; + } + } + setNativeProps(props: Object) { if (this._scrollRef) { this._scrollRef.setNativeProps(props); @@ -1124,17 +1132,18 @@ class VirtualizedList extends React.PureComponent { // TODO (T35574538): findNodeHandle sometimes crashes with "Unable to find // node on an unmounted component" during scrolling try { - UIManager.measureLayout( - ReactNative.findNodeHandle(this), + if (!this._scrollRef) { + return; + } + // We are asuming that getOutermostParentListRef().getScrollRef() + // is a non-null reference to a ScrollView + this._scrollRef.measureLayout( ReactNative.findNodeHandle( - this.context.virtualizedList.getOutermostParentListRef(), + this.context.virtualizedList + .getOutermostParentListRef() + .getScrollRef() + .getNativeScrollRef(), ), - error => { - console.warn( - "VirtualizedList: Encountered an error while measuring a list's" + - ' offset from its containing VirtualizedList.', - ); - }, (x, y, width, height) => { this._offsetFromParentVirtualizedList = this._selectOffset({x, y}); this._scrollMetrics.contentLength = this._selectLength({ @@ -1148,6 +1157,12 @@ class VirtualizedList extends React.PureComponent { this._scrollMetrics.visibleLength = scrollMetrics.visibleLength; this._scrollMetrics.offset = scrollMetrics.offset; }, + error => { + console.warn( + "VirtualizedList: Encountered an error while measuring a list's" + + ' offset from its containing VirtualizedList.', + ); + }, ); } catch (error) { console.warn(