updateMetrics method

bool updateMetrics({
  1. required int viewportExtent,
  2. required int contentExtent,
})

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;
}