diff --git a/packages/flutter/lib/src/widgets/navigator.dart b/packages/flutter/lib/src/widgets/navigator.dart index de6eb711fb..e2994f8baf 100644 --- a/packages/flutter/lib/src/widgets/navigator.dart +++ b/packages/flutter/lib/src/widgets/navigator.dart @@ -68,9 +68,15 @@ abstract class Route { } class NamedRouteSettings { - const NamedRouteSettings({ this.name, this.mostValuableKeys }); + const NamedRouteSettings({ + this.name, + this.mostValuableKeys, + this.isInitialRoute: false + }); + final String name; final Set mostValuableKeys; + final bool isInitialRoute; String toString() { String result = '"$name"'; @@ -161,7 +167,8 @@ class NavigatorState extends State { assert(config.observer == null || config.observer.navigator == null); config.observer?._navigator = this; _push(config.onGenerateRoute(new NamedRouteSettings( - name: config.initialRoute ?? Navigator.defaultRouteName + name: config.initialRoute ?? Navigator.defaultRouteName, + isInitialRoute: true ))); } @@ -265,7 +272,7 @@ class NavigatorState extends State { assert(_history.indexOf(anchorRoute) > 0); _replace(oldRoute: _history[_history.indexOf(anchorRoute)-1], newRoute: newRoute); } - + void _removeRouteBefore(Route anchorRoute) { assert(!_debugLocked); assert(() { _debugLocked = true; return true; }); @@ -356,7 +363,7 @@ class NavigatorTransaction { } NavigatorState _navigator; bool _debugOpen = true; - + /// Invokes the Navigator's onGenerateRoute callback to create a route with /// the given name, then calls [push()] with that route. void pushNamed(String name, { Set mostValuableKeys }) { @@ -425,7 +432,7 @@ class NavigatorTransaction { assert(_debugOpen); return _navigator._pop(result); } - + /// Calls pop() repeatedly until the given route is the current route. /// If it is already the current route, nothing happens. void popUntil(Route targetRoute) { @@ -437,4 +444,4 @@ class NavigatorTransaction { assert(_debugOpen); _debugOpen = false; } -} \ No newline at end of file +} diff --git a/packages/flutter/lib/src/widgets/pages.dart b/packages/flutter/lib/src/widgets/pages.dart index 186262aba9..409965c023 100644 --- a/packages/flutter/lib/src/widgets/pages.dart +++ b/packages/flutter/lib/src/widgets/pages.dart @@ -4,6 +4,8 @@ import 'dart:async'; +import 'package:flutter/animation.dart'; + import 'navigator.dart'; import 'overlay.dart'; import 'routes.dart'; @@ -19,6 +21,13 @@ abstract class PageRoute extends ModalRoute { bool canTransitionTo(TransitionRoute nextRoute) => nextRoute is PageRoute; bool canTransitionFrom(TransitionRoute nextRoute) => nextRoute is PageRoute; + Performance createPerformanceController() { + Performance performance = super.createPerformanceController(); + if (settings.isInitialRoute) + performance.progress = 1.0; + return performance; + } + // Subclasses can override this method to customize way heroes are inserted void insertHeroOverlayEntry(OverlayEntry entry, Object tag, OverlayState overlay) { overlay.insert(entry); diff --git a/packages/unit/test/widget/page_forward_transitions_test.dart b/packages/unit/test/widget/page_forward_transitions_test.dart index 71b2577bb4..468289e4f7 100644 --- a/packages/unit/test/widget/page_forward_transitions_test.dart +++ b/packages/unit/test/widget/page_forward_transitions_test.dart @@ -28,7 +28,7 @@ class TestTransition extends TransitionComponent { } class TestRoute extends PageRoute { - TestRoute(this.child); + TestRoute({ this.child, NamedRouteSettings settings}) : super(settings: settings); final Widget child; Duration get transitionDuration => kMaterialPageRouteTransitionDuration; Color get barrierColor => null; @@ -71,7 +71,8 @@ void main() { switch (settings.name) { case '/': return new TestRoute( - new Builder( + settings: settings, + child: new Builder( key: insideKey, builder: (BuildContext context) { PageRoute route = ModalRoute.of(context); @@ -90,30 +91,18 @@ void main() { } ) ); - case '/2': return new TestRoute(new Text('E')); - case '/3': return new TestRoute(new Text('F')); - case '/4': return new TestRoute(new Text('G')); + case '/2': return new TestRoute(settings: settings, child: new Text('E')); + case '/3': return new TestRoute(settings: settings, child: new Text('F')); + case '/4': return new TestRoute(settings: settings, child: new Text('G')); } } ) ); - // TODO(ianh): Remove the first part of this test once the first page doesn't animate in - NavigatorState navigator = insideKey.currentContext.ancestorStateOfType(NavigatorState); - expect(state(), equals('AC')); // transition ->1 is at 0.0 - - tester.pump(kFourTenthsOfTheTransitionDuration); - expect(state(), equals('AC')); // transition ->1 is at 0.4 - - tester.pump(kFourTenthsOfTheTransitionDuration); - expect(state(), equals('BC')); // transition ->1 is at 0.8 - - tester.pump(kFourTenthsOfTheTransitionDuration); expect(state(), equals('BC')); // transition ->1 is at 1.0 - navigator.openTransaction((NavigatorTransaction transaction) => transaction.pushNamed('/2')); expect(state(), equals('BC')); // transition 1->2 is not yet built tester.pump();