updateMetrics method
Updates metrics after layout. Returns true if offset was clamped.
Implementation
bool updateMetrics({
required int viewportExtent,
required int contentExtent,
}) {
final prevViewport = _viewportExtent;
final prevContent = _contentExtent;
final prevOffset = _offset;
final nextViewport = math.max(0, viewportExtent);
final incomingContent = math.max(0, contentExtent);
assert(
!_thumbDragActive ||
_deferredContentExtent == null ||
_deferredContentExtent! >= incomingContent,
'updateMetrics: deferred content shrank during drag '
'($_deferredContentExtent -> $incomingContent)',
);
_viewportExtent = nextViewport;
if (_thumbDragActive) {
// Track the max content extent observed during drag so releasing at
// the bottom never snaps the offset upward even if measurements
// temporarily shrink the estimate.
_deferredContentExtent = math.max(
_deferredContentExtent ?? incomingContent,
incomingContent,
);
} else {
_deferredContentExtent = null;
if (_contentFrozen) {
assert(incomingContent >= 0);
_contentExtent = math.max(_contentExtent, incomingContent);
} else {
_contentExtent = incomingContent;
}
}
final clamped = _clampOffset();
assert(_offset >= 0, 'updateMetrics: offset must be non-negative');
assert(
_offset <= maxOffset,
'updateMetrics: offset $_offset exceeds max $maxOffset',
);
if (prevViewport != _viewportExtent ||
prevContent != _contentExtent ||
clamped) {
_traceScroll(
'widget_scroll.metrics '
'view=$prevViewport->$_viewportExtent '
'content=$prevContent->$_contentExtent '
'incoming=$incomingContent drag=$_thumbDragActive '
'offset=$prevOffset->$_offset '
'max=$maxOffset clamped=$clamped',
);
}
return clamped;
}