layout method
Implementation
@override
void layout(BoxConstraints constraints) {
super.layout(constraints);
final maxWidth =
width ??
(constraints.hasBoundedWidth ? constraints.maxWidth.round() : 0);
final boundedHeight = constraints.hasBoundedHeight
? constraints.maxHeight.round()
: null;
final viewportHeight = height ?? boundedHeight;
final separatorBreaks = _separatorBreaks(separator);
final itemCount = _itemCount;
if (variableHeight) {
if (_lastMaxWidth != maxWidth) {
assert(
_lastMaxWidth == null || (_lastMaxWidth! - maxWidth).abs() <= 100,
'layout: maxWidth jumped from $_lastMaxWidth to $maxWidth',
);
final widthDiff = _lastMaxWidth != null
? (_lastMaxWidth! - maxWidth).abs()
: 0;
_traceScroll(
'virtual_list.clear_measurements '
'zone=$zoneId reason=_lastMaxWidth($_lastMaxWidth)!=maxWidth($maxWidth)'
' diff=$widthDiff',
);
_lastMaxWidth = maxWidth;
if (widthDiff > 4) {
_clearMeasurements();
}
}
final baseEstimate = math
.max(1, estimatedItemExtent ?? itemExtent)
.toInt();
final estimate = _resolveAdaptiveEstimate(baseEstimate);
_syncCache(itemCount, separatorBreaks, estimate);
_preMeasureItems(
itemCount: itemCount,
maxWidth: maxWidth,
estimate: estimate,
separatorBreaks: separatorBreaks,
);
final contentHeight = _estimatedContentHeight();
final layoutHeight = viewportHeight ?? contentHeight;
_setMetrics(
viewportExtent: layoutHeight.toInt(),
contentExtent: contentHeight.toInt(),
);
size = constraints.constrain(
Size(maxWidth.toDouble(), layoutHeight.toDouble()),
);
return;
}
final itemHeight = math.max(1, itemExtent).toInt();
final contentHeight = itemCount == 0
? 0
: itemCount * itemHeight + (itemCount - 1) * separatorBreaks;
final layoutHeight = viewportHeight ?? contentHeight;
_setMetrics(
viewportExtent: layoutHeight.toInt(),
contentExtent: contentHeight.toInt(),
);
size = constraints.constrain(
Size(maxWidth.toDouble(), layoutHeight.toDouble()),
);
}