diff --git a/packages/flutter/lib/src/widgets/list_wheel_scroll_view.dart b/packages/flutter/lib/src/widgets/list_wheel_scroll_view.dart index ecac23d5088..672582f0658 100644 --- a/packages/flutter/lib/src/widgets/list_wheel_scroll_view.dart +++ b/packages/flutter/lib/src/widgets/list_wheel_scroll_view.dart @@ -250,15 +250,15 @@ class FixedExtentScrollController extends ScrollController { /// The returned [Future] resolves when the animation completes. /// /// The `duration` and `curve` arguments must not be null. - Future animateToItem(int itemIndex, { + Future animateToItem(int itemIndex, { @required Duration duration, @required Curve curve, - }) { + }) async { if (!hasClients) { - return new Future.value(); + return new Future.value(); } - final List> futures = >[]; + final List> futures = >[]; for (_FixedExtentScrollPosition position in positions) { futures.add(position.animateTo( itemIndex * position.itemExtent, @@ -266,7 +266,7 @@ class FixedExtentScrollController extends ScrollController { curve: curve, )); } - return Future.wait(futures); + return await Future.wait(futures); } /// Changes which item index is centered in the controlled scroll view. diff --git a/packages/flutter/test/widgets/list_wheel_scroll_view_test.dart b/packages/flutter/test/widgets/list_wheel_scroll_view_test.dart index 013ebb19238..69174eb622f 100644 --- a/packages/flutter/test/widgets/list_wheel_scroll_view_test.dart +++ b/packages/flutter/test/widgets/list_wheel_scroll_view_test.dart @@ -922,6 +922,43 @@ void main() { expect(controller.selectedItem, 0); }); + testWidgets('controller animateToItem', (WidgetTester tester) async { + final FixedExtentScrollController controller = new FixedExtentScrollController(initialItem: 10); + final List paintedChildren = []; + + await tester.pumpWidget( + new Directionality( + textDirection: TextDirection.ltr, + child: new ListWheelScrollView( + controller: controller, + itemExtent: 100.0, + children: new List.generate(100, (int index) { + return new CustomPaint( + painter: new TestCallbackPainter(onPaint: () { + paintedChildren.add(index); + }), + ); + }), + ), + ), + ); + + // Screen is 600px tall. Item 10 is in the center and each item is 100px tall. + expect(paintedChildren, [7, 8, 9, 10, 11, 12, 13]); + + paintedChildren.clear(); + controller.animateToItem( + 0, + duration: const Duration(seconds: 1), + curve: Curves.linear, + ); + await tester.pump(); + await tester.pump(const Duration(seconds: 1)); + + expect(paintedChildren, [0, 1, 2, 3]); + expect(controller.selectedItem, 0); + }); + testWidgets('onSelectedItemChanged and controller are in sync', (WidgetTester tester) async { final List selectedItems = []; final FixedExtentScrollController controller = new FixedExtentScrollController(initialItem: 10);