Fixed assertion caused by invalid layout of hidden Yoga nodes

Summary:
That's interesting!
If we apply `display: none;` style to some node, Yoga will stop calculation layout for this subtree (which is reasonable).
So, from RN perspective we have to stop applying layout for hidden subtree because it is meaningless and causes another errors.

Note: We do actually not support `display: none;` yet. It stops computing layout, but it does not hide the views!

Reviewed By: javache

Differential Revision: D5168651

fbshipit-source-id: 29a9385c76a0f9d637285fc0d268ccc39879ca0a
This commit is contained in:
Valentin Shergin 2017-06-20 17:12:51 -07:00 committed by Facebook Github Bot
parent abfa63c67e
commit ac3f345b07
1 changed files with 8 additions and 1 deletions

View File

@ -165,10 +165,17 @@ static void RCTProcessMetaPropsBorder(const YGValue metaProps[META_PROP_COUNT],
if (!YGNodeGetHasNewLayout(node)) {
return;
}
YGNodeSetHasNewLayout(node, false);
RCTAssert(!YGNodeIsDirty(node), @"Attempt to get layout metrics from dirtied Yoga node.");
YGNodeSetHasNewLayout(node, false);
if (YGNodeStyleGetDisplay(node) == YGDisplayNone) {
// If the node is hidden (has `display: none;`), its (and its descendants)
// layout metrics are invalid and/or dirtied, so we have to stop here.
return;
}
#if RCT_DEBUG
// This works around a breaking change in Yoga layout where setting flexBasis needs to be set explicitly, instead of relying on flex to propagate.
// We check for it by seeing if a width/height is provided along with a flexBasis of 0 and the width/height is laid out as 0.