layout method

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

Implementation

@override
void layout(BoxConstraints constraints) {
  super.layout(constraints);
  if (children.isNotEmpty) {
    final child = children.first;
    final trackWidth = math
        .max(thickness, gutterWidth ?? thickness)
        .toDouble();
    final reserved = overlay ? 0.0 : (math.max(0, gap) + trackWidth);

    if (overlay || !constraints.hasBoundedWidth) {
      child.layout(constraints);
      size = constraints.constrain(
        Size(
          child.size.width + (overlay ? 0.0 : reserved),
          child.size.height,
        ),
      );
      return;
    }

    // First measure at full width so the child can publish accurate scroll
    // metrics. Only reserve a gutter when scrolling is actually needed.
    child.layout(constraints);
    final needsScrollbar =
        controller.contentExtent > controller.viewportExtent;
    if (needsScrollbar) {
      final maxWidth = math.max(0.0, constraints.maxWidth - reserved);
      final minWidth = math.min(constraints.minWidth, maxWidth);
      child.layout(
        BoxConstraints(
          minWidth: minWidth,
          maxWidth: maxWidth,
          minHeight: constraints.minHeight,
          maxHeight: constraints.maxHeight,
        ),
      );
      size = constraints.constrain(
        Size(child.size.width + reserved, child.size.height),
      );
      return;
    }

    size = constraints.constrain(Size(child.size.width, child.size.height));
  }
}