Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 80679f0

Browse files
authored
[flutter_test] perf: find.ancestor (#108868)
1 parent 7270c48 commit 80679f0

File tree

2 files changed

+37
-2
lines changed

2 files changed

+37
-2
lines changed

packages/flutter_test/lib/src/finders.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -923,7 +923,8 @@ class _DescendantFinder extends Finder {
923923

924924
@override
925925
Iterable<Element> apply(Iterable<Element> candidates) {
926-
return candidates.where((Element element) => descendant.evaluate().contains(element));
926+
final Iterable<Element> descendants = descendant.evaluate();
927+
return candidates.where((Element element) => descendants.contains(element));
927928
}
928929

929930
@override
@@ -956,7 +957,8 @@ class _AncestorFinder extends Finder {
956957

957958
@override
958959
Iterable<Element> apply(Iterable<Element> candidates) {
959-
return candidates.where((Element element) => ancestor.evaluate().contains(element));
960+
final Iterable<Element> ancestors = ancestor.evaluate();
961+
return candidates.where((Element element) => ancestors.contains(element));
960962
}
961963

962964
@override

packages/flutter_test/test/widget_tester_test.dart

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,30 @@ void main() {
361361
matchRoot: true,
362362
), findsOneWidget);
363363
});
364+
365+
testWidgets('is fast in deep tree', (WidgetTester tester) async {
366+
await tester.pumpWidget(
367+
Directionality(
368+
textDirection: TextDirection.ltr,
369+
child: _deepWidgetTree(
370+
depth: 1000,
371+
child: Row(
372+
children: <Widget>[
373+
_deepWidgetTree(
374+
depth: 1000,
375+
child: Column(children: fooBarTexts),
376+
),
377+
],
378+
),
379+
),
380+
),
381+
);
382+
383+
expect(find.ancestor(
384+
of: find.text('bar'),
385+
matching: find.byType(Row),
386+
), findsOneWidget);
387+
});
364388
});
365389

366390
group('pageBack', () {
@@ -854,3 +878,12 @@ class _AlwaysRepaint extends CustomPainter {
854878
onPaint();
855879
}
856880
}
881+
882+
/// Wraps [child] in [depth] layers of [SizedBox]
883+
Widget _deepWidgetTree({required int depth, required Widget child}) {
884+
Widget tree = child;
885+
for (int i = 0; i < depth; i += 1) {
886+
tree = SizedBox(child: tree);
887+
}
888+
return tree;
889+
}

0 commit comments

Comments
 (0)