Add ScrollMetrics.extentTotal for completeness (#126607)
When implementing scrollbars, I found that it would be useful and idiomatic to be able to do `m.extentInside / m.extentTotal` to get the scrollbar thumb size.
diff --git a/packages/flutter/lib/src/widgets/scroll_metrics.dart b/packages/flutter/lib/src/widgets/scroll_metrics.dart
index 6a4f82c..2448cf5 100644
--- a/packages/flutter/lib/src/widgets/scroll_metrics.dart
+++ b/packages/flutter/lib/src/widgets/scroll_metrics.dart
@@ -115,11 +115,12 @@
/// This is the content above the content described by [extentInside].
double get extentBefore => math.max(pixels - minScrollExtent, 0.0);
- /// The quantity of content conceptually "inside" the viewport in the scrollable.
+ /// The quantity of content conceptually "inside" the viewport in the
+ /// scrollable (including empty space if the total amount of content is less
+ /// than the [viewportDimension]).
///
- /// The value is typically the height of the viewport when [outOfRange] is false.
- /// It could be less if there is less content visible than the size of the
- /// viewport, such as when overscrolling.
+ /// The value is typically the extent of the viewport ([viewportDimension])
+ /// when [outOfRange] is false. It can be less when overscrolling.
///
/// The value is always non-negative, and less than or equal to [viewportDimension].
double get extentInside {
@@ -135,6 +136,12 @@
/// This is the content below the content described by [extentInside].
double get extentAfter => math.max(maxScrollExtent - pixels, 0.0);
+ /// The total quantity of content available.
+ ///
+ /// This is the sum of [extentBefore], [extentInside], and [extentAfter], modulo
+ /// any rounding errors.
+ double get extentTotal => maxScrollExtent - minScrollExtent + viewportDimension;
+
/// The [FlutterView.devicePixelRatio] of the view that the [Scrollable]
/// associated with this metrics object is drawn into.
double get devicePixelRatio;
diff --git a/packages/flutter/test/widgets/scroll_notification_test.dart b/packages/flutter/test/widgets/scroll_notification_test.dart
index afcd3a5..0493f8a 100644
--- a/packages/flutter/test/widgets/scroll_notification_test.dart
+++ b/packages/flutter/test/widgets/scroll_notification_test.dart
@@ -31,6 +31,7 @@
expect(event.metrics.extentBefore, 0.0);
expect(event.metrics.extentInside, 600.0);
expect(event.metrics.extentAfter, 400.0);
+ expect(event.metrics.extentTotal, 1000.0);
events.clear();
final TestGesture gesture = await tester.startGesture(const Offset(100.0, 100.0));
@@ -53,6 +54,7 @@
expect(event.metrics.extentBefore, 10.0);
expect(event.metrics.extentInside, 590.0);
expect(event.metrics.extentAfter, 0.0);
+ expect(event.metrics.extentTotal, 600.0);
events.clear();
// The content dimensions does not change.