Create WidgetTester.ensureVisible(Finder) (#22620)

This is just a shorthand for
Scrollable.ensureVisible(tester.element(finder))

Fixes #8185
This commit is contained in:
Dinesh Ahuja 2018-10-19 00:47:47 +05:30 committed by Todd Volkert
parent d5777b6a9a
commit 7fbb5b9f32
2 changed files with 30 additions and 0 deletions

View File

@ -677,6 +677,12 @@ class WidgetTester extends WidgetController implements HitTestDispatcher, Ticker
SemanticsHandle ensureSemantics() {
return binding.pipelineOwner.ensureSemantics();
}
/// Given a widget `W` specified by [finder] and a [Scrollable] widget `S` in
/// its ancestry tree, this scrolls `S` so as to make `W` visible.
///
/// Shorthand for `Scrollable.ensureVisible(tester.element(finder))`
Future<void> ensureVisible(Finder finder) => Scrollable.ensureVisible(element(finder));
}
typedef _TickerDisposeCallback = void Function(_TestTicker ticker);

View File

@ -616,6 +616,30 @@ void main() {
semanticsHandle.dispose();
});
});
group('ensureVisible', () {
testWidgets('scrolls to make widget visible', (WidgetTester tester) async {
await tester.pumpWidget(
MaterialApp(
home: Scaffold(
body: ListView.builder(
itemCount: 20,
shrinkWrap: true,
itemBuilder: (BuildContext context, int i) => ListTile(title: Text('Item $i')),
),
),
),
);
// Make sure widget isn't on screen
expect(find.text('Item 15', skipOffstage: true), findsNothing);
await tester.ensureVisible(find.text('Item 15', skipOffstage: false));
await tester.pumpAndSettle();
expect(find.text('Item 15', skipOffstage: true), findsOneWidget);
});
});
}
class FakeMatcher extends AsyncMatcher {