diff --git a/packages/flutter/lib/src/widgets/sliver_resizing_header.dart b/packages/flutter/lib/src/widgets/sliver_resizing_header.dart index 1a5041e4cf..69e7c2a48d 100644 --- a/packages/flutter/lib/src/widgets/sliver_resizing_header.dart +++ b/packages/flutter/lib/src/widgets/sliver_resizing_header.dart @@ -223,7 +223,7 @@ class _RenderSliverResizingHeader extends RenderSliver paintExtent: math.min(childExtent, remainingPaintExtent), layoutExtent: clampDouble(layoutExtent, 0, remainingPaintExtent), maxPaintExtent: childExtent, - maxScrollObstructionExtent: childExtent, + maxScrollObstructionExtent: minExtent, cacheExtent: calculateCacheOffset(constraints, from: 0.0, to: childExtent), hasVisualOverflow: true, // Conservatively say we do have overflow to avoid complexity. ); diff --git a/packages/flutter/test/widgets/sliver_resizing_header_test.dart b/packages/flutter/test/widgets/sliver_resizing_header_test.dart index aef1ab5229..ba59959f9d 100644 --- a/packages/flutter/test/widgets/sliver_resizing_header_test.dart +++ b/packages/flutter/test/widgets/sliver_resizing_header_test.dart @@ -357,4 +357,57 @@ void main() { await tester.pumpAndSettle(); expect(getHeaderHeight(), 200); }); + + testWidgets('SliverResizingHeader maxScrollObstructionExtent', (WidgetTester tester) async { + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: NestedScrollView( + headerSliverBuilder: + (BuildContext context, _) => [ + SliverOverlapAbsorber( + handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context), + sliver: const SliverResizingHeader( + minExtentPrototype: SizedBox(height: 100), + maxExtentPrototype: SizedBox(height: 300), + child: SizedBox.expand(child: Text('header')), + ), + ), + ], + body: Builder( + builder: + (BuildContext context) => CustomScrollView( + slivers: [ + SliverOverlapInjector( + handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context), + ), + SliverList( + delegate: SliverChildBuilderDelegate( + (BuildContext context, int index) => + SizedBox(height: 50, child: Text('$index')), + childCount: 100, + ), + ), + ], + ), + ), + ), + ), + ), + ); + + double getHeaderHeight() => tester.getSize(find.text('header')).height; + + expect(getHeaderHeight(), 300); + + // After scrolling down 150px, the header height becomes 150px + await tester.drag(find.byType(NestedScrollView), const Offset(0, -150)); + await tester.pumpAndSettle(); + expect(getHeaderHeight(), 150); + + // After scrolling down an additional 150px, the header height becomes 100px + await tester.drag(find.byType(NestedScrollView), const Offset(0, -150)); + await tester.pumpAndSettle(); + expect(getHeaderHeight(), 100); + }); }