layout method
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));
}
}