Implementation
@override
bool get isHeightStretch {
RenderStyle renderStyle = this;
if (renderStyle.parent == null) {
return false;
}
bool isStretch = false;
RenderStyle parentRenderStyle = renderStyle.parent!;
bool isParentFlex = parentRenderStyle.display == CSSDisplay.flex ||
parentRenderStyle.display == CSSDisplay.inlineFlex;
bool isHorizontalDirection = false;
bool isFlexNoWrap = false;
bool isChildStretchSelf = false;
if (isParentFlex) {
// The absolutely-positioned box is considered to be “fixed-size”, a value of stretch
// is treated the same as flex-start.
// https://www.w3.org/TR/css-flexbox-1/#abspos-items
bool isPositioned = renderStyle.position == CSSPositionType.absolute
|| renderStyle.position == CSSPositionType.fixed;
if (isPositioned) {
return false;
}
isHorizontalDirection = CSSFlex.isHorizontalFlexDirection(parentRenderStyle.flexDirection);
isFlexNoWrap = parentRenderStyle.flexWrap != FlexWrap.wrap &&
parentRenderStyle.flexWrap != FlexWrap.wrapReverse;
isChildStretchSelf = renderStyle.alignSelf != AlignSelf.auto
? renderStyle.alignSelf == AlignSelf.stretch
: parentRenderStyle.alignItems == AlignItems.stretch;
}
CSSLengthValue marginTop = renderStyle.marginTop;
CSSLengthValue marginBottom = renderStyle.marginBottom;
// Display as block if flex vertical layout children and stretch children
if (marginTop.isNotAuto && marginBottom.isNotAuto &&
isParentFlex && isHorizontalDirection && isFlexNoWrap && isChildStretchSelf) {
isStretch = true;
}
return isStretch;
}