performBoxLayout method

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

Perform layout with typed box constraints

Subclasses override this instead of performLayout. The default implementation sizes to the maxima, treating an unbounded axis as the corresponding lower bound.

Implementation

@override
void performBoxLayout(BoxConstraints constraints) {
  if (_child != null) {
    // Combine parent constraints with additional constraints. `null`
    // maxima are unbounded, so picking the tighter of two means: the
    // non-null one wins when only one side specifies a limit.
    final combinedMinWidth = math.max(
      constraints.minWidth,
      _additionalConstraints.minWidth,
    );
    final combinedMaxWidth = _minNullable(
      constraints.maxWidth,
      _additionalConstraints.maxWidth,
    );
    final combinedMinHeight = math.max(
      constraints.minHeight,
      _additionalConstraints.minHeight,
    );
    final combinedMaxHeight = _minNullable(
      constraints.maxHeight,
      _additionalConstraints.maxHeight,
    );

    final childConstraints = BoxConstraints(
      minWidth: combinedMaxWidth == null
          ? combinedMinWidth
          : math.min(combinedMinWidth, combinedMaxWidth),
      maxWidth: combinedMaxWidth,
      minHeight: combinedMaxHeight == null
          ? combinedMinHeight
          : math.min(combinedMinHeight, combinedMaxHeight),
      maxHeight: combinedMaxHeight,
    );

    // Layout child with combined constraints
    _child!.layout(childConstraints);

    // Position child at origin
    positionChild(_child!, 0, 0);

    // Size ourselves to the child
    size = _child!.size;
  } else {
    // No child, size to minimum of additional constraints
    final constrainedSize = Size(
      _additionalConstraints.constrainWidth(0),
      _additionalConstraints.constrainHeight(0),
    );
    size = Size(
      constraints.constrainWidth(constrainedSize.width),
      constraints.constrainHeight(constrainedSize.height),
    );
  }
}