setPixels method
- double newPixels
Update the scroll position (pixels) to a given pixel value.
This should only be called by the current ScrollActivity, either during the transient callback phase or in response to user input.
Returns the overscroll, if any. If the return value is 0.0, that means
that pixels now returns the given value
. If the return value is
positive, then pixels is less than the requested value
by the given
amount (overscroll past the max extent), and if it is negative, it is
greater than the requested value
by the given amount (underscroll past
the min extent).
The amount of overscroll is computed by applyBoundaryConditions.
The amount of the change that is applied is reported using didUpdateScrollPositionBy. If there is any overscroll, it is reported using didOverscrollBy.
Implementation
double setPixels(double newPixels) {
assert(hasPixels);
assert(SchedulerBinding.instance.schedulerPhase != SchedulerPhase.persistentCallbacks, "A scrollable's position should not change during the build, layout, and paint phases, otherwise the rendering will be confused.");
if (newPixels != pixels) {
final double overscroll = applyBoundaryConditions(newPixels);
assert(() {
final double delta = newPixels - pixels;
if (overscroll.abs() > delta.abs()) {
throw FlutterError(
'$runtimeType.applyBoundaryConditions returned invalid overscroll value.\n'
'setPixels() was called to change the scroll offset from $pixels to $newPixels.\n'
'That is a delta of $delta units.\n'
'$runtimeType.applyBoundaryConditions reported an overscroll of $overscroll units.',
);
}
return true;
}());
final double oldPixels = pixels;
_pixels = newPixels - overscroll;
if (_pixels != oldPixels) {
if (outOfRange) {
context.setIgnorePointer(false);
}
notifyListeners();
didUpdateScrollPositionBy(pixels - oldPixels);
}
if (overscroll.abs() > precisionErrorTolerance) {
didOverscrollBy(overscroll);
return overscroll;
}
}
return 0.0;
}