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 коммит произвёл Facebook Github Bot
Родитель abfa63c67e
Коммит ac3f345b07
1 изменённых файлов: 8 добавлений и 1 удалений

Просмотреть файл

@ -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.