Commit ba936c0f authored by Adam Barth's avatar Adam Barth

The intial route shouldn't run its entrance animation

Instead, it should enter the world fully formed.
parent 73e62d38
......@@ -68,9 +68,15 @@ abstract class Route<T> {
}
class NamedRouteSettings {
const NamedRouteSettings({ this.name, this.mostValuableKeys });
const NamedRouteSettings({
this.name,
this.mostValuableKeys,
this.isInitialRoute: false
});
final String name;
final Set<Key> mostValuableKeys;
final bool isInitialRoute;
String toString() {
String result = '"$name"';
......@@ -161,7 +167,8 @@ class NavigatorState extends State<Navigator> {
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<Navigator> {
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<Key> 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
}
......@@ -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<T> extends ModalRoute<T> {
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);
......
......@@ -28,7 +28,7 @@ class TestTransition extends TransitionComponent {
}
class TestRoute<T> extends PageRoute<T> {
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();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment