intrinsicSize property

  1. @override
Vector2 get intrinsicSize
override

Any positioning done in layoutChildren should not affect the intrinsicSize. This is because all crossAxisAlignment transformations fall within the largestCrossAxisLength, while mainAxisAlignment is entirely ignored in all cases where intrinsicSize is needed. This means that intrinsicSize should be used either before or at the start of layoutChildren.

Implementation

@override
Vector2 get intrinsicSize {
  final positionChildren = this.positionChildren;
  final crossAxisVectorIndex = direction.crossAxis.axisIndex;
  final mainAxisVectorIndex = direction.mainAxis.axisIndex;
  if (positionChildren.isEmpty) {
    return Vector2.zero();
  }
  final largestCrossAxisLength = positionChildren.fold(0.0, (largest, child) {
    final crossAxisLength = child is ExpandedComponent
        ? child.intrinsicSize[crossAxisVectorIndex]
        : child.size[crossAxisVectorIndex];
    return max(largest, crossAxisLength);
  });
  // This is tricky because it depends on the mainAxisAlignment.
  // This should only apply when mainAxisAlignment is start, center, or end.
  // spaceAround, spaceBetween, and spaceEvenly requires the size as a
  // constraint.
  final cumulativeMainAxisLength =
      ((positionChildren.length - 1) * gap) +
      positionChildren.fold(0.0, (sum, child) {
        final mainAxisLength = child is ExpandedComponent
            ? child.intrinsicSize[mainAxisVectorIndex]
            : child.size[mainAxisVectorIndex];
        return sum + mainAxisLength;
      });
  final out = Vector2.zero();
  out[mainAxisVectorIndex] = cumulativeMainAxisLength;
  out[crossAxisVectorIndex] = largestCrossAxisLength;
  return out;
}