diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java index 3d0410638c0..6497c6bce98 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java @@ -31,11 +31,11 @@ import com.facebook.react.bridge.WritableMap; import com.facebook.react.bridge.WritableNativeMap; import com.facebook.react.common.ReactConstants; import com.facebook.react.config.ReactFeatureFlags; +import com.facebook.react.uimanager.FabricViewStateManager; import com.facebook.react.uimanager.MeasureSpecAssertions; import com.facebook.react.uimanager.PixelUtil; import com.facebook.react.uimanager.ReactClippingViewGroup; import com.facebook.react.uimanager.ReactClippingViewGroupHelper; -import com.facebook.react.uimanager.StateWrapper; import com.facebook.react.uimanager.ViewProps; import com.facebook.react.uimanager.events.NativeGestureUtil; import com.facebook.react.views.view.ReactViewBackgroundManager; @@ -52,7 +52,8 @@ import java.util.List; public class ReactScrollView extends ScrollView implements ReactClippingViewGroup, ViewGroup.OnHierarchyChangeListener, - View.OnLayoutChangeListener { + View.OnLayoutChangeListener, + FabricViewStateManager.HasFabricViewStateManager { private static @Nullable Field sScrollerField; private static boolean sTriedToGetScrollerField = false; @@ -89,7 +90,7 @@ public class ReactScrollView extends ScrollView private ReactViewBackgroundManager mReactBackgroundManager; private int pendingContentOffsetX = UNSET_CONTENT_OFFSET; private int pendingContentOffsetY = UNSET_CONTENT_OFFSET; - private @Nullable StateWrapper mStateWrapper; + private final FabricViewStateManager mFabricViewStateManager = new FabricViewStateManager(); private @Nullable ValueAnimator mScrollAnimator; private int mFinalAnimatedPositionScrollX; @@ -956,18 +957,10 @@ public class ReactScrollView extends ScrollView mReactBackgroundManager.setBorderStyle(style); } - public void updateState(@Nullable StateWrapper stateWrapper) { - mStateWrapper = stateWrapper; - } - /** * Called on any stabilized onScroll change to propagate content offset value to a Shadow Node. */ - private void updateStateOnScroll(int scrollX, int scrollY) { - if (mStateWrapper == null) { - return; - } - + private void updateStateOnScroll(final int scrollX, final int scrollY) { // Dedupe events to reduce JNI traffic if (scrollX == mLastStateUpdateScrollX && scrollY == mLastStateUpdateScrollY) { return; @@ -976,14 +969,25 @@ public class ReactScrollView extends ScrollView mLastStateUpdateScrollX = scrollX; mLastStateUpdateScrollY = scrollY; - WritableMap map = new WritableNativeMap(); - map.putDouble(CONTENT_OFFSET_LEFT, PixelUtil.toDIPFromPixel(scrollX)); - map.putDouble(CONTENT_OFFSET_TOP, PixelUtil.toDIPFromPixel(scrollY)); + mFabricViewStateManager.setState( + new FabricViewStateManager.StateUpdateCallback() { + @Override + public WritableMap getStateUpdate() { - mStateWrapper.updateState(map); + WritableMap map = new WritableNativeMap(); + map.putDouble(CONTENT_OFFSET_LEFT, PixelUtil.toDIPFromPixel(scrollX)); + map.putDouble(CONTENT_OFFSET_TOP, PixelUtil.toDIPFromPixel(scrollY)); + return map; + } + }); } private void updateStateOnScroll() { updateStateOnScroll(getScrollX(), getScrollY()); } + + @Override + public FabricViewStateManager getFabricViewStateManager() { + return mFabricViewStateManager; + } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollViewManager.java b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollViewManager.java index 8e6f93ec28d..23ad78a5a88 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollViewManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollViewManager.java @@ -319,7 +319,7 @@ public class ReactScrollViewManager extends ViewGroupManager @Override public Object updateState( ReactScrollView view, ReactStylesDiffMap props, @Nullable StateWrapper stateWrapper) { - view.updateState(stateWrapper); + view.getFabricViewStateManager().setStateWrapper(stateWrapper); return null; }