Fix SliverScrollingPersistentHeader not able to update stretchConfiguration (#112042)
diff --git a/packages/flutter/lib/src/widgets/sliver_persistent_header.dart b/packages/flutter/lib/src/widgets/sliver_persistent_header.dart
index eb165979..754f493 100644
--- a/packages/flutter/lib/src/widgets/sliver_persistent_header.dart
+++ b/packages/flutter/lib/src/widgets/sliver_persistent_header.dart
@@ -402,6 +402,11 @@
stretchConfiguration: delegate.stretchConfiguration,
);
}
+
+ @override
+ void updateRenderObject(BuildContext context, covariant _RenderSliverScrollingPersistentHeaderForWidgets renderObject) {
+ renderObject.stretchConfiguration = delegate.stretchConfiguration;
+ }
}
class _RenderSliverScrollingPersistentHeaderForWidgets extends RenderSliverScrollingPersistentHeader
diff --git a/packages/flutter/test/widgets/sliver_persistent_header_test.dart b/packages/flutter/test/widgets/sliver_persistent_header_test.dart
new file mode 100644
index 0000000..fe30f1e
--- /dev/null
+++ b/packages/flutter/test/widgets/sliver_persistent_header_test.dart
@@ -0,0 +1,63 @@
+// Copyright 2014 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'package:flutter/material.dart';
+import 'package:flutter/src/rendering/sliver_persistent_header.dart';
+import 'package:flutter_test/flutter_test.dart';
+
+void main() {
+ testWidgets(
+ '_SliverScrollingPersistentHeader 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(
+ delegate: TestDelegate(
+ stretchConfiguration: OverScrollHeaderStretchConfiguration(
+ stretchTriggerOffset: stretchTriggerOffset,
+ ),
+ ),
+ )
+ ],
+ ),
+ ));
+ }
+
+ expect(
+ tester.allWidgets.where((Widget w) =>
+ w.runtimeType.toString() == '_SliverScrollingPersistentHeader'),
+ isNotEmpty);
+
+ final RenderSliverScrollingPersistentHeader render = tester.allRenderObjects
+ .whereType<RenderSliverScrollingPersistentHeader>()
+ .first;
+ expect(render.stretchConfiguration?.stretchTriggerOffset, 20);
+ });
+}
+
+class TestDelegate extends SliverPersistentHeaderDelegate {
+ TestDelegate({this.stretchConfiguration, this.showOnScreenConfiguration});
+
+ @override
+ double get maxExtent => 200.0;
+
+ @override
+ double get minExtent => 200.0;
+
+ @override
+ Widget build(
+ BuildContext context, double shrinkOffset, bool overlapsContent) {
+ return Container(height: maxExtent);
+ }
+
+ @override
+ bool shouldRebuild(TestDelegate oldDelegate) => false;
+
+ @override
+ final OverScrollHeaderStretchConfiguration? stretchConfiguration;
+ @override
+ final PersistentHeaderShowOnScreenConfiguration? showOnScreenConfiguration;
+}