diff --git a/ReactAndroid/src/main/java/com/facebook/react/flat/FlatUIImplementation.java b/ReactAndroid/src/main/java/com/facebook/react/flat/FlatUIImplementation.java index 8aa07d036..a45ddca63 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/flat/FlatUIImplementation.java +++ b/ReactAndroid/src/main/java/com/facebook/react/flat/FlatUIImplementation.java @@ -217,10 +217,12 @@ public class FlatUIImplementation extends UIImplementation { callback); } - private void ensureMountsToViewAndBackingViewIsCreated(int reactTag) { + private boolean ensureMountsToViewAndBackingViewIsCreated(int reactTag) { FlatShadowNode node = (FlatShadowNode) resolveShadowNode(reactTag); + boolean didUpdate = !node.mountsToView(); node.forceMountToView(); - mStateBuilder.ensureBackingViewIsCreated(node); + didUpdate = didUpdate || mStateBuilder.ensureBackingViewIsCreated(node); + return didUpdate; } @Override @@ -243,11 +245,15 @@ public class FlatUIImplementation extends UIImplementation { @Override public void dispatchViewManagerCommand(int reactTag, int commandId, ReadableArray commandArgs) { - ensureMountsToViewAndBackingViewIsCreated(reactTag); - // need to make sure any ui operations (UpdateViewGroup, for example, etc) have already - // happened before we actually dispatch the view manager command (since otherwise, the command - // may go to an empty shell parent without its children, which is against the specs). - mStateBuilder.applyUpdates((FlatShadowNode) resolveShadowNode(reactTag)); + if (ensureMountsToViewAndBackingViewIsCreated(reactTag)) { + // need to make sure any ui operations (UpdateViewGroup, for example, etc) have already + // happened before we actually dispatch the view manager command (since otherwise, the command + // may go to an empty shell parent without its children, which is against the specs). note + // that we only want to applyUpdates if the view has not yet been created so that it does + // get created (otherwise, we may end up changing the View's position when we're not supposed + // to, for example). + mStateBuilder.applyUpdates((FlatShadowNode) resolveShadowNode(reactTag)); + } super.dispatchViewManagerCommand(reactTag, commandId, commandArgs); } diff --git a/ReactAndroid/src/main/java/com/facebook/react/flat/StateBuilder.java b/ReactAndroid/src/main/java/com/facebook/react/flat/StateBuilder.java index 167d4cf22..f5972247a 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/flat/StateBuilder.java +++ b/ReactAndroid/src/main/java/com/facebook/react/flat/StateBuilder.java @@ -147,15 +147,16 @@ import com.facebook.react.uimanager.events.EventDispatcher; mStylesToUpdate.add(styles); } - /* package */ void ensureBackingViewIsCreated(FlatShadowNode node) { + /* package */ boolean ensureBackingViewIsCreated(FlatShadowNode node) { if (node.isBackingViewCreated()) { - return; + return false; } int tag = node.getReactTag(); mOperationsQueue.enqueueCreateView(node.getThemedContext(), tag, node.getViewClass(), null); node.signalBackingViewIsCreated(); + return true; } /* package */ void dropView(FlatShadowNode node) {