From c75f3b7d9f4b17681afec021da7bf8188f742824 Mon Sep 17 00:00:00 2001 From: Denis Koroskin Date: Sat, 5 Mar 2016 21:25:09 -0800 Subject: [PATCH] Make sure we call notifyChanged(true) when a child is added to RCTVirtualText Summary: CSSNode.addChildAt() calls dirty() to invalidate the node and propagate dirty flag up to the root. However, ReactShadowNode overrides dirty() for virtual nodes so it does nothing. This results in bugs where an added text doesn't trigger a measure pass because RCTText is never dirtied. To fix the bug, override addChildAt() in RCTVirtualText and explicitly call notifyChanged(true) to make sure hosting RCTText is dirtied and re-measured/re-laid out. Reviewed By: ahmedre Differential Revision: D3016827 --- .../java/com/facebook/react/flat/RCTVirtualText.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/flat/RCTVirtualText.java b/ReactAndroid/src/main/java/com/facebook/react/flat/RCTVirtualText.java index 051fd52d7..9c8e2ca2e 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/flat/RCTVirtualText.java +++ b/ReactAndroid/src/main/java/com/facebook/react/flat/RCTVirtualText.java @@ -16,10 +16,11 @@ import android.text.Spannable; import android.text.SpannableStringBuilder; import android.text.TextUtils; +import com.facebook.csslayout.CSSNode; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.uimanager.PixelUtil; -import com.facebook.react.uimanager.annotations.ReactProp; import com.facebook.react.uimanager.ViewProps; +import com.facebook.react.uimanager.annotations.ReactProp; /** * RCTVirtualText is a {@link FlatTextShadowNode} that can contain font styling information. @@ -38,6 +39,12 @@ import com.facebook.react.uimanager.ViewProps; private FontStylingSpan mFontStylingSpan = FontStylingSpan.INSTANCE; private ShadowStyleSpan mShadowStyleSpan = ShadowStyleSpan.INSTANCE; + @Override + public void addChildAt(CSSNode child, int i) { + super.addChildAt(child, i); + notifyChanged(true); + } + @Override protected void performCollectText(SpannableStringBuilder builder) { for (int i = 0, childCount = getChildCount(); i < childCount; ++i) {