diff --git a/packages/flutter_test/lib/src/finders.dart b/packages/flutter_test/lib/src/finders.dart index f5262d614a..51b3160dda 100644 --- a/packages/flutter_test/lib/src/finders.dart +++ b/packages/flutter_test/lib/src/finders.dart @@ -923,7 +923,8 @@ class _DescendantFinder extends Finder { @override Iterable apply(Iterable candidates) { - return candidates.where((Element element) => descendant.evaluate().contains(element)); + final Iterable descendants = descendant.evaluate(); + return candidates.where((Element element) => descendants.contains(element)); } @override @@ -956,7 +957,8 @@ class _AncestorFinder extends Finder { @override Iterable apply(Iterable candidates) { - return candidates.where((Element element) => ancestor.evaluate().contains(element)); + final Iterable ancestors = ancestor.evaluate(); + return candidates.where((Element element) => ancestors.contains(element)); } @override diff --git a/packages/flutter_test/test/widget_tester_test.dart b/packages/flutter_test/test/widget_tester_test.dart index 9d35cb61e6..3eddb29e72 100644 --- a/packages/flutter_test/test/widget_tester_test.dart +++ b/packages/flutter_test/test/widget_tester_test.dart @@ -361,6 +361,30 @@ void main() { matchRoot: true, ), findsOneWidget); }); + + testWidgets('is fast in deep tree', (WidgetTester tester) async { + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: _deepWidgetTree( + depth: 1000, + child: Row( + children: [ + _deepWidgetTree( + depth: 1000, + child: Column(children: fooBarTexts), + ), + ], + ), + ), + ), + ); + + expect(find.ancestor( + of: find.text('bar'), + matching: find.byType(Row), + ), findsOneWidget); + }); }); group('pageBack', () { @@ -854,3 +878,12 @@ class _AlwaysRepaint extends CustomPainter { onPaint(); } } + +/// Wraps [child] in [depth] layers of [SizedBox] +Widget _deepWidgetTree({required int depth, required Widget child}) { + Widget tree = child; + for (int i = 0; i < depth; i += 1) { + tree = SizedBox(child: tree); + } + return tree; +}