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
This commit is contained in:
Denis Koroskin 2016-03-05 21:25:09 -08:00 committed by Ahmed El-Helw
parent 272d99ed56
commit c75f3b7d9f
1 changed files with 8 additions and 1 deletions

View File

@ -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) {