Skip to content

Commit a783e42

Browse files
authored
Fix SliverPadding geometry (#106071)
1 parent f67d9b7 commit a783e42

File tree

2 files changed

+41
-2
lines changed

2 files changed

+41
-2
lines changed

packages/flutter/lib/src/rendering/sliver_padding.dart

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,10 +119,21 @@ abstract class RenderSliverEdgeInsetsPadding extends RenderSliver with RenderObj
119119
final double mainAxisPadding = this.mainAxisPadding;
120120
final double crossAxisPadding = this.crossAxisPadding;
121121
if (child == null) {
122+
final double paintExtent = calculatePaintOffset(
123+
constraints,
124+
from: 0.0,
125+
to: mainAxisPadding,
126+
);
127+
final double cacheExtent = calculateCacheOffset(
128+
constraints,
129+
from: 0.0,
130+
to: mainAxisPadding,
131+
);
122132
geometry = SliverGeometry(
123133
scrollExtent: mainAxisPadding,
124-
paintExtent: math.min(mainAxisPadding, constraints.remainingPaintExtent),
134+
paintExtent: math.min(paintExtent, constraints.remainingPaintExtent),
125135
maxPaintExtent: mainAxisPadding,
136+
cacheExtent: cacheExtent,
126137
);
127138
return;
128139
}

packages/flutter/test/widgets/slivers_padding_test.dart

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,34 @@ void main() {
271271
expect(tester.renderObject<RenderBox>(find.text('x')).localToGlobal(Offset.zero), const Offset(0.0, 200.0));
272272
});
273273

274+
testWidgets('SliverPadding with no child reports correct geometry as scroll offset changes', (WidgetTester tester) async {
275+
// Regression test for https://github.com/flutter/flutter/issues/64506
276+
final ScrollController controller = ScrollController();
277+
await tester.pumpWidget(
278+
Directionality(
279+
textDirection: TextDirection.ltr,
280+
child: CustomScrollView(
281+
controller: controller,
282+
slivers: const <Widget>[
283+
SliverPadding(padding: EdgeInsets.all(100.0)),
284+
SliverToBoxAdapter(child: SizedBox(width: 400.0, height: 400.0, child: Text('x'))),
285+
],
286+
),
287+
),
288+
);
289+
expect(tester.renderObject<RenderBox>(find.text('x')).localToGlobal(Offset.zero), const Offset(0.0, 200.0));
290+
expect(
291+
tester.renderObject<RenderSliverPadding>(find.byType(SliverPadding)).geometry!.paintExtent,
292+
200.0,
293+
);
294+
controller.jumpTo(50.0);
295+
await tester.pump();
296+
expect(
297+
tester.renderObject<RenderSliverPadding>(find.byType(SliverPadding)).geometry!.paintExtent,
298+
150.0,
299+
);
300+
});
301+
274302
testWidgets('Viewport+SliverPadding changing padding', (WidgetTester tester) async {
275303
await tester.pumpWidget(
276304
Directionality(
@@ -366,7 +394,7 @@ void main() {
366394
),
367395
),
368396
);
369-
expect(tester.renderObject<RenderSliverPadding>(find.byType(SliverPadding)).afterPadding, 1.0);
397+
expect(tester.renderObject<RenderSliverPadding>(find.byType(SliverPadding, skipOffstage: false)).afterPadding, 1.0);
370398
});
371399

372400
testWidgets('SliverPadding propagates geometry offset corrections', (WidgetTester tester) async {

0 commit comments

Comments
 (0)