diff --git a/packages/flutter/lib/src/widgets/page_view.dart b/packages/flutter/lib/src/widgets/page_view.dart index 98ac8d41f7..37f3753313 100644 --- a/packages/flutter/lib/src/widgets/page_view.dart +++ b/packages/flutter/lib/src/widgets/page_view.dart @@ -114,8 +114,8 @@ class PageController extends ScrollController { /// The returned [Future] resolves when the animation completes. /// /// The `duration` and `curve` arguments must not be null. - void nextPage({ @required Duration duration, @required Curve curve }) { - animateToPage(page.round() + 1, duration: duration, curve: curve); + Future nextPage({ @required Duration duration, @required Curve curve }) { + return animateToPage(page.round() + 1, duration: duration, curve: curve); } /// Animates the controlled [PageView] to the previous page. @@ -124,8 +124,8 @@ class PageController extends ScrollController { /// The returned [Future] resolves when the animation completes. /// /// The `duration` and `curve` arguments must not be null. - void previousPage({ @required Duration duration, @required Curve curve }) { - animateToPage(page.round() - 1, duration: duration, curve: curve); + Future previousPage({ @required Duration duration, @required Curve curve }) { + return animateToPage(page.round() - 1, duration: duration, curve: curve); } @override diff --git a/packages/flutter/test/widgets/page_view_test.dart b/packages/flutter/test/widgets/page_view_test.dart index a13c60d7ff..7cd33729ce 100644 --- a/packages/flutter/test/widgets/page_view_test.dart +++ b/packages/flutter/test/widgets/page_view_test.dart @@ -211,6 +211,38 @@ void main() { expect(find.text('Arizona'), findsOneWidget); }); + testWidgets('PageController nextPage and previousPage return Futures that resolve', (WidgetTester tester) async { + final PageController controller = new PageController(); + await tester.pumpWidget(new Directionality( + textDirection: TextDirection.ltr, + child: new PageView( + controller: controller, + children: kStates.map((String state) => new Text(state)).toList(), + ), + )); + + bool nextPageCompleted = false; + controller.nextPage(duration: const Duration(milliseconds: 150), curve: Curves.ease) + .then((_) => nextPageCompleted = true); + + expect(nextPageCompleted, false); + await tester.pump(const Duration(milliseconds: 200)); + expect(nextPageCompleted, false); + await tester.pump(const Duration(milliseconds: 200)); + expect(nextPageCompleted, true); + + + bool previousPageCompleted = false; + controller.previousPage(duration: const Duration(milliseconds: 150), curve: Curves.ease) + .then((_) => previousPageCompleted = true); + + expect(previousPageCompleted, false); + await tester.pump(const Duration(milliseconds: 200)); + expect(previousPageCompleted, false); + await tester.pump(const Duration(milliseconds: 200)); + expect(previousPageCompleted, true); + }); + testWidgets('PageView in zero-size container', (WidgetTester tester) async { await tester.pumpWidget(new Directionality( textDirection: TextDirection.ltr,