Skip to content

Commit 2914842

Browse files
Yonah Karpmeta-codesync[bot]
authored andcommitted
Yoga | dirty YGNode when removing it from parent (#55411)
Summary: X-link: react/yoga#1868 Pull Request resolved: #55411 ## Context When a child node is removed from its parent via YGNodeRemoveChild, the child's calculated layout is cleared (setLayout({})) but the child node is not marked dirty. This causes issues when the view is removed views and later reused with the same layout values. the layout values were cleared (resulting in NaN/0), but since the layout values are the same for the newly reattached node, it isn't dirtied. However, the user would expect it to be dirty, as: a) a fully new node would be dirty by default. b) They just set layout **Example**: - Node is removed from the view and it's layout is cleared. - Node is reattatched and set with height/width that happens to be same as previous - Checking if the view is dirty unexpectedly gives false, despite user setting a "new" value. - Pulling height/width gives 0, as layout hasn't been recalculated yet ## This Diff Marks the removed child node as dirty when clearing its layout in YGNodeRemoveChild, ensuring that subsequent layout calculations will properly recalculate the child's layout values ## Changelog: [Internal] [Fixed] - Marks removed child node as dirty when clearing its layout in YGNodeRemoveChild, ensuring that subsequent layout calculations will properly recalculate the child's layout values Reviewed By: NickGerleman Differential Revision: D92280506 fbshipit-source-id: 6f1adb6f5b8cbe9d3461746b613e42f890b1e75e
1 parent b0013ea commit 2914842

1 file changed

Lines changed: 2 additions & 0 deletions

File tree

  • packages/react-native/ReactCommon/yoga/yoga

packages/react-native/ReactCommon/yoga/yoga/YGNode.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ void YGNodeRemoveChild(
177177
if (owner == childOwner) {
178178
excludedChild->setLayout({}); // layout is no longer valid
179179
excludedChild->setOwner(nullptr);
180+
excludedChild->setDirty(true); // invalidate cache
180181
}
181182
owner->markDirtyAndPropagate();
182183
}
@@ -198,6 +199,7 @@ void YGNodeRemoveAllChildren(const YGNodeRef ownerRef) {
198199
yoga::Node* oldChild = owner->getChild(i);
199200
oldChild->setLayout({}); // layout is no longer valid
200201
oldChild->setOwner(nullptr);
202+
oldChild->setDirty(true); // invalidate cache
201203
}
202204
owner->clearChildren();
203205
owner->markDirtyAndPropagate();

0 commit comments

Comments
 (0)