setPixels method

  1. @override
double setPixels(
  1. double available,
  2. AppBarPosition appBar,
  3. NestedScrollPosition scroll
)
override

Updates the given appbar based on available scroll offset, the current appbar position, and the nested scroll position.

Implementation

@override
double setPixels(
  double available,
  AppBarPosition appBar,
  NestedScrollPosition scroll,
) {
  assert(floating ? !dragOnlyExpanding : true,
      "[floating] and [dragOnlyExpanding] cannot be used together.");

  // APPBAR SCROLLING CONSTRAINTS

  // No consume when bouncing overscroll for appbar pixels safety.
  if (scroll.totalPixels < scroll.minScrollExtent ||
      scroll.totalPixels > scroll.maxScrollExtent) {
    return 0;
  }

  if (!floating) {
    // No consume when scroll offset is zero ~ infinity.
    if (scroll.pixels > precisionErrorTolerance) return 0;

    if (dragOnlyExpanding &&
        scroll.isBallisticScrolling &&
        appBar.shrinkedPercent == 1) {
      return 0;
    }
  }

  if (!alwaysScrolling) {
    if (appBar.extent > scroll.maxScrollExtent + appBar.pixels) return 0;
  }

  final double consumed = appBar.setPixelsWithDelta(available);
  final double minScrollExtent = scroll.minScrollExtent;
  final double maxScrollExtent = scroll.maxScrollExtent;

  // When the appbar scrolls the layout intrinsic size changes so this
  // information is preemptively communicated to the [ScrollPosition].
  if (consumed.abs() > precisionErrorTolerance) {
    scroll.applyContentDimensions(
      minScrollExtent,
      max(minScrollExtent, maxScrollExtent + consumed),
    );
  }

  return consumed;
}