Skip to content

Commit 7b262d9

Browse files
authored
Test SliverMainAxisGroup offstage child (flutter#159406)
```dart import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { testWidgets('my test', (WidgetTester tester) async { await tester.pumpWidget( MaterialApp( home: LayoutBuilder( builder: (context, view) { return CustomScrollView( slivers: [ SliverMainAxisGroup( slivers: [ SliverToBoxAdapter(child: SizedBox(height: view.maxHeight)), const SliverToBoxAdapter(child: Text('1')), ], ) ], ); }, ), ), ); expect(find.text('1'), findsNothing); }); } ``` The above test should have passed, but it failed. This PR fixes the issue. ## Pre-launch Checklist - [x] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [x] I read the [Tree Hygiene] wiki page, which explains my responsibilities. - [x] I read and followed the [Flutter Style Guide], including [Features we expect every widget to implement]. - [x] I signed the [CLA]. - [x] I listed at least one issue that this PR fixes in the description above. - [ ] I updated/added relevant documentation (doc comments with `///`). - [x] I added new tests to check the change I am making, or this PR is [test-exempt]. - [x] I followed the [breaking change policy] and added [Data Driven Fixes] where supported. - [x] All existing and new tests are passing. If you need help, consider asking for advice on the #hackers-new channel on [Discord]. <!-- Links --> [Contributor Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview [Tree Hygiene]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md [test-exempt]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests [Flutter Style Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md [Features we expect every widget to implement]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement [CLA]: https://cla.developers.google.com/ [flutter/tests]: https://github.com/flutter/tests [breaking change policy]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes [Discord]: https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md [Data Driven Fixes]: https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
1 parent 7814641 commit 7b262d9

File tree

4 files changed

+43
-5
lines changed

4 files changed

+43
-5
lines changed

examples/api/test/widgets/sliver/sliver_main_axis_group.0_test.dart

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,16 @@ void main() {
1919

2020
final RenderSliverPersistentHeader renderAppBar = tester.renderObject<RenderSliverPersistentHeader>(find.byType(SliverAppBar));
2121
final RenderSliverList renderSliverList = tester.renderObject<RenderSliverList>(find.byType(SliverList));
22-
final RenderSliverToBoxAdapter renderSliverAdapter = tester.renderObject<RenderSliverToBoxAdapter>(find.byType(SliverToBoxAdapter));
22+
final RenderSliverToBoxAdapter renderSliverAdapter = tester.renderObject<RenderSliverToBoxAdapter>(
23+
find.descendant(
24+
of: find.byType(SliverMainAxisGroup),
25+
matching: find.byType(
26+
SliverToBoxAdapter,
27+
skipOffstage: false,
28+
),
29+
skipOffstage: false,
30+
),
31+
);
2332

2433
// renderAppBar, renderSliverList, and renderSliverAdapter1 are part of the same sliver group.
2534
expect(renderAppBar.geometry!.scrollExtent, equals(70.0));

packages/flutter/lib/src/widgets/sliver.dart

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1741,8 +1741,23 @@ class SliverMainAxisGroup extends MultiChildRenderObjectWidget {
17411741
required List<Widget> slivers,
17421742
}) : super(children: slivers);
17431743

1744+
@override
1745+
MultiChildRenderObjectElement createElement() => _SliverMainAxisGroupElement(this);
1746+
17441747
@override
17451748
RenderSliverMainAxisGroup createRenderObject(BuildContext context) {
17461749
return RenderSliverMainAxisGroup();
17471750
}
17481751
}
1752+
1753+
class _SliverMainAxisGroupElement extends MultiChildRenderObjectElement {
1754+
_SliverMainAxisGroupElement(SliverMainAxisGroup super.widget);
1755+
1756+
@override
1757+
void debugVisitOnstageChildren(ElementVisitor visitor) {
1758+
children.where((Element e) {
1759+
final RenderSliver renderSliver = e.renderObject! as RenderSliver;
1760+
return renderSliver.geometry!.visible;
1761+
}).forEach(visitor);
1762+
}
1763+
}

packages/flutter/test/widgets/editable_text_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16960,7 +16960,7 @@ void main() {
1696016960
),
1696116961
);
1696216962
await tester.pumpWidget(widget);
16963-
await tester.showKeyboard(find.byType(EditableText));
16963+
await tester.showKeyboard(find.byType(EditableText, skipOffstage: false));
1696416964
await tester.pumpAndSettle();
1696516965
expect(scrollController.offset, 75.0);
1696616966
});

packages/flutter/test/widgets/sliver_main_axis_group_test.dart

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ void main() {
198198
const Rect.fromLTRB(0.0, 0.0, 200.0, 600.0),
199199
);
200200

201-
final List<RenderSliverList> renderSlivers = tester.renderObjectList<RenderSliverList>(find.byType(SliverList)).toList();
201+
final List<RenderSliverList> renderSlivers = tester.renderObjectList<RenderSliverList>(find.byType(SliverList, skipOffstage: false)).toList();
202202
final RenderSliverList first = renderSlivers[0];
203203
final RenderSliverList second = renderSlivers[1];
204204

@@ -268,7 +268,7 @@ void main() {
268268
const Rect.fromLTRB(100.0, 0.0, 300.0, 600.0),
269269
);
270270

271-
final List<RenderSliverList> renderSlivers = tester.renderObjectList<RenderSliverList>(find.byType(SliverList)).toList();
271+
final List<RenderSliverList> renderSlivers = tester.renderObjectList<RenderSliverList>(find.byType(SliverList, skipOffstage: false)).toList();
272272
final RenderSliverList first = renderSlivers[0];
273273
final RenderSliverList second = renderSlivers[1];
274274

@@ -598,7 +598,7 @@ void main() {
598598
await tester.pumpAndSettle();
599599

600600
// At a scroll offset of 630, a normal scrolling header should be out of view.
601-
final RenderSliverPersistentHeader renderHeader = tester.renderObject(find.byType(SliverPersistentHeader)) as RenderSliverPersistentHeader;
601+
final RenderSliverPersistentHeader renderHeader = tester.renderObject(find.byType(SliverPersistentHeader, skipOffstage: false)) as RenderSliverPersistentHeader;
602602
expect(renderHeader.constraints.scrollOffset, equals(630));
603603
expect(renderHeader.geometry!.layoutExtent, equals(0.0));
604604
});
@@ -855,6 +855,20 @@ void main() {
855855

856856
expect(tester.getTopLeft(find.byKey(firstTextFieldKey)), const Offset(0, 60));
857857
});
858+
859+
testWidgets('SliverMainAxisGroup offstage child', (WidgetTester tester) async {
860+
await tester.pumpWidget(
861+
_buildSliverMainAxisGroup(
862+
viewportHeight: 300,
863+
slivers: <Widget>[
864+
const SliverToBoxAdapter(child: SizedBox(height: 300)),
865+
const SliverToBoxAdapter(child: SizedBox(height: 100, child: Text('1'))),
866+
]
867+
)
868+
);
869+
expect(find.text('1'), findsNothing);
870+
expect(find.text('1', skipOffstage: false), findsOneWidget);
871+
});
858872
}
859873

860874
Widget _buildSliverList({

0 commit comments

Comments
 (0)