layout method

  1. @override
void layout(
  1. BoxConstraints constraints
)
override

Implementation

@override
void layout(BoxConstraints constraints) {
  super.layout(constraints);
  _child?.layout(constraints.loosen());

  final child = _child;
  final content = child?.paint() ?? '';
  final contentWidth = Layout.getWidth(content);
  final contentHeight = Layout.getHeight(content);

  // Match Flutter Align/Center semantics: when width/height factors are not
  // provided, expand to fill bounded constraints; otherwise shrink-wrap.
  final resolvedWidth =
      _resolveDimension(width) ??
      (constraints.hasBoundedWidth
          ? constraints.maxWidth.toInt()
          : contentWidth);
  final resolvedHeight =
      _resolveDimension(height) ??
      (constraints.hasBoundedHeight
          ? constraints.maxHeight.toInt()
          : contentHeight);

  if (child != null) {
    final resolvedAlign = alignment == null
        ? align
        : _horizontalFromAlignment(alignment!);
    final resolvedVertical = alignment == null
        ? verticalAlign
        : _verticalFromAlignment(alignment!);

    final maxDx = math.max(0, resolvedWidth - contentWidth);
    final maxDy = math.max(0, resolvedHeight - contentHeight);
    final dx = switch (resolvedAlign) {
      HorizontalAlign.left => 0,
      HorizontalAlign.center => maxDx ~/ 2,
      HorizontalAlign.right => maxDx,
    };
    final dy = switch (resolvedVertical) {
      VerticalAlign.top => 0,
      VerticalAlign.center => maxDy ~/ 2,
      VerticalAlign.bottom => maxDy,
    };

    child.offset = Offset(dx.toDouble(), dy.toDouble());
  }

  final rendered = _renderAligned(content);
  _lastPaint = rendered;
  size = constraints.constrain(
    Size(
      Layout.getWidth(rendered).toDouble(),
      Layout.getHeight(rendered).toDouble(),
    ),
  );
}