Fix incorrect padding in SafeAreaView

Summary:
Changelog: [Internal]

`SafeAreaViewShadowNode` we made incorrect assumption that setting `style` on YGNode and then copying it, always copies the style.

This is incorrect, style is only copied once `YGNodeCalculateLayout` has been called on either the node or its parent.

Reviewed By: JoshuaGross

Differential Revision: D22945677

fbshipit-source-id: 9c063c2dfe4d2390cf2fd10a96d2de418fa69376
This commit is contained in:
Samuel Susla
2020-08-05 11:39:25 -07:00
committed by Facebook GitHub Bot
parent 4cdb1951b4
commit b179c4bebe
4 changed files with 18 additions and 25 deletions
@@ -35,10 +35,7 @@ class SafeAreaViewComponentDescriptor final
shadowNode->getState());
auto stateData = state->getData();
if (safeAreaViewShadowNode->alreadyAppliedPadding != stateData.padding) {
safeAreaViewShadowNode->alreadyAppliedPadding = stateData.padding;
layoutableShadowNode->setPadding(stateData.padding);
}
layoutableShadowNode->setPadding(stateData.padding);
ConcreteComponentDescriptor::adopt(shadowNode);
}
@@ -12,13 +12,5 @@ namespace react {
extern const char SafeAreaViewComponentName[] = "SafeAreaView";
SafeAreaViewShadowNode::SafeAreaViewShadowNode(
ShadowNode const &sourceShadowNode,
ShadowNodeFragment const &fragment)
: ConcreteViewShadowNode(sourceShadowNode, fragment),
alreadyAppliedPadding(
static_cast<SafeAreaViewShadowNode const &>(sourceShadowNode)
.alreadyAppliedPadding) {}
} // namespace react
} // namespace facebook
@@ -26,13 +26,6 @@ class SafeAreaViewShadowNode final : public ConcreteViewShadowNode<
ViewEventEmitter,
SafeAreaViewState> {
using ConcreteViewShadowNode::ConcreteViewShadowNode;
public:
EdgeInsets alreadyAppliedPadding{};
SafeAreaViewShadowNode(
ShadowNode const &sourceShadowNode,
ShadowNodeFragment const &fragment);
};
} // namespace react
@@ -285,12 +285,23 @@ void YogaLayoutableShadowNode::setPadding(RectangleEdges<Float> padding) const {
ensureUnsealed();
auto style = yogaNode_.getStyle();
style.padding()[YGEdgeTop] = yogaStyleValueFromFloat(padding.top);
style.padding()[YGEdgeLeft] = yogaStyleValueFromFloat(padding.left);
style.padding()[YGEdgeRight] = yogaStyleValueFromFloat(padding.right);
style.padding()[YGEdgeBottom] = yogaStyleValueFromFloat(padding.bottom);
yogaNode_.setStyle(style);
yogaNode_.setDirty(true);
auto leftPadding = yogaStyleValueFromFloat(padding.left);
auto topPadding = yogaStyleValueFromFloat(padding.top);
auto rightPadding = yogaStyleValueFromFloat(padding.right);
auto bottomPadding = yogaStyleValueFromFloat(padding.bottom);
if (leftPadding != style.padding()[YGEdgeLeft] ||
topPadding != style.padding()[YGEdgeTop] ||
rightPadding != style.padding()[YGEdgeRight] ||
bottomPadding != style.padding()[YGEdgeBottom]) {
style.padding()[YGEdgeTop] = yogaStyleValueFromFloat(padding.top);
style.padding()[YGEdgeLeft] = yogaStyleValueFromFloat(padding.left);
style.padding()[YGEdgeRight] = yogaStyleValueFromFloat(padding.right);
style.padding()[YGEdgeBottom] = yogaStyleValueFromFloat(padding.bottom);
yogaNode_.setStyle(style);
yogaNode_.setDirty(true);
}
}
void YogaLayoutableShadowNode::setPositionType(