Fix SliverPinnedPersistentHeader, also not able to update stretchConfiguration and showOnScreenConfiguration (#112043)
diff --git a/packages/flutter/lib/src/widgets/sliver_persistent_header.dart b/packages/flutter/lib/src/widgets/sliver_persistent_header.dart
index 754f493..f548e9b 100644
--- a/packages/flutter/lib/src/widgets/sliver_persistent_header.dart
+++ b/packages/flutter/lib/src/widgets/sliver_persistent_header.dart
@@ -428,6 +428,13 @@
showOnScreenConfiguration: delegate.showOnScreenConfiguration,
);
}
+
+ @override
+ void updateRenderObject(BuildContext context, covariant _RenderSliverPinnedPersistentHeaderForWidgets renderObject) {
+ renderObject
+ ..stretchConfiguration = delegate.stretchConfiguration
+ ..showOnScreenConfiguration = delegate.showOnScreenConfiguration;
+ }
}
class _RenderSliverPinnedPersistentHeaderForWidgets extends RenderSliverPinnedPersistentHeader
diff --git a/packages/flutter/test/widgets/sliver_persistent_header_test.dart b/packages/flutter/test/widgets/sliver_persistent_header_test.dart
index fe30f1e..8fb239f 100644
--- a/packages/flutter/test/widgets/sliver_persistent_header_test.dart
+++ b/packages/flutter/test/widgets/sliver_persistent_header_test.dart
@@ -36,6 +36,68 @@
.first;
expect(render.stretchConfiguration?.stretchTriggerOffset, 20);
});
+
+ testWidgets(
+ '_SliverPinnedPersistentHeader should update stretchConfiguration',
+ (WidgetTester tester) async {
+ for (final double stretchTriggerOffset in <double>[10.0, 20.0]) {
+ await tester.pumpWidget(MaterialApp(
+ home: CustomScrollView(
+ slivers: <Widget>[
+ SliverPersistentHeader(
+ pinned: true,
+ delegate: TestDelegate(
+ stretchConfiguration: OverScrollHeaderStretchConfiguration(
+ stretchTriggerOffset: stretchTriggerOffset,
+ ),
+ ),
+ )
+ ],
+ ),
+ ));
+ }
+
+ expect(
+ tester.allWidgets.where((Widget w) =>
+ w.runtimeType.toString() == '_SliverPinnedPersistentHeader'),
+ isNotEmpty);
+
+ final RenderSliverPinnedPersistentHeader render = tester.allRenderObjects
+ .whereType<RenderSliverPinnedPersistentHeader>()
+ .first;
+ expect(render.stretchConfiguration?.stretchTriggerOffset, 20);
+ });
+
+ testWidgets(
+ '_SliverPinnedPersistentHeader should update showOnScreenConfiguration',
+ (WidgetTester tester) async {
+ for (final double maxShowOnScreenExtent in <double>[1000, 2000]) {
+ await tester.pumpWidget(MaterialApp(
+ home: CustomScrollView(
+ slivers: <Widget>[
+ SliverPersistentHeader(
+ pinned: true,
+ delegate: TestDelegate(
+ showOnScreenConfiguration:
+ PersistentHeaderShowOnScreenConfiguration(
+ maxShowOnScreenExtent: maxShowOnScreenExtent),
+ ),
+ )
+ ],
+ ),
+ ));
+ }
+
+ expect(
+ tester.allWidgets.where((Widget w) =>
+ w.runtimeType.toString() == '_SliverPinnedPersistentHeader'),
+ isNotEmpty);
+
+ final RenderSliverPinnedPersistentHeader render = tester.allRenderObjects
+ .whereType<RenderSliverPinnedPersistentHeader>()
+ .first;
+ expect(render.showOnScreenConfiguration?.maxShowOnScreenExtent, 2000);
+ });
}
class TestDelegate extends SliverPersistentHeaderDelegate {