Commit cd19702c authored by Hixie's avatar Hixie

Be more discerning with forward transitions

So you don't fade out when going to a popup menu, for example.
parent 93b1f100
...@@ -5,8 +5,6 @@ ...@@ -5,8 +5,6 @@
import 'package:flutter/animation.dart'; import 'package:flutter/animation.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'colors.dart';
class _MaterialPageTransition extends TransitionWithChild { class _MaterialPageTransition extends TransitionWithChild {
_MaterialPageTransition({ _MaterialPageTransition({
Key key, Key key,
...@@ -52,7 +50,8 @@ class MaterialPageRoute<T> extends PageRoute<T> { ...@@ -52,7 +50,8 @@ class MaterialPageRoute<T> extends PageRoute<T> {
final WidgetBuilder builder; final WidgetBuilder builder;
Duration get transitionDuration => kMaterialPageRouteTransitionDuration; Duration get transitionDuration => kMaterialPageRouteTransitionDuration;
Color get barrierColor => Colors.black54; Color get barrierColor => null;
bool canTransitionFrom(TransitionRoute nextRoute) => false;
Widget buildPage(BuildContext context) { Widget buildPage(BuildContext context) {
Widget result = builder(context); Widget result = builder(context);
......
...@@ -150,7 +150,7 @@ abstract class TransitionRoute<T> extends OverlayRoute<T> { ...@@ -150,7 +150,7 @@ abstract class TransitionRoute<T> extends OverlayRoute<T> {
final ProxyPerformance forwardPerformance = new ProxyPerformance(); final ProxyPerformance forwardPerformance = new ProxyPerformance();
void didPushNext(Route nextRoute) { void didPushNext(Route nextRoute) {
if (nextRoute is TransitionRoute) { if (nextRoute is TransitionRoute && canTransitionTo(nextRoute) && nextRoute.canTransitionFrom(this)) {
PerformanceView current = forwardPerformance.masterPerformance; PerformanceView current = forwardPerformance.masterPerformance;
if (current != null) { if (current != null) {
if (current is TrainHoppingPerformance) { if (current is TrainHoppingPerformance) {
...@@ -177,6 +177,9 @@ abstract class TransitionRoute<T> extends OverlayRoute<T> { ...@@ -177,6 +177,9 @@ abstract class TransitionRoute<T> extends OverlayRoute<T> {
super.didPushNext(nextRoute); super.didPushNext(nextRoute);
} }
bool canTransitionTo(TransitionRoute nextRoute) => true;
bool canTransitionFrom(TransitionRoute nextRoute) => true;
Widget wrapTransition(BuildContext context, Widget child) { Widget wrapTransition(BuildContext context, Widget child) {
return buildForwardTransition( return buildForwardTransition(
context, context,
...@@ -434,4 +437,6 @@ abstract class PageRoute<T> extends ModalRoute<T> { ...@@ -434,4 +437,6 @@ abstract class PageRoute<T> extends ModalRoute<T> {
}) : super(completer: completer, settings: settings); }) : super(completer: completer, settings: settings);
bool get opaque => true; bool get opaque => true;
bool get barrierDismissable => false; bool get barrierDismissable => false;
bool canTransitionTo(TransitionRoute nextRoute) => nextRoute is PageRoute;
bool canTransitionFrom(TransitionRoute nextRoute) => nextRoute is PageRoute;
} }
...@@ -27,6 +27,14 @@ class TestTransition extends TransitionComponent { ...@@ -27,6 +27,14 @@ class TestTransition extends TransitionComponent {
} }
} }
class TestRoute<T> extends PageRoute<T> {
TestRoute(this.child);
final Widget child;
Duration get transitionDuration => kMaterialPageRouteTransitionDuration;
Color get barrierColor => null;
Widget buildPage(BuildContext context) => child;
}
void main() { void main() {
final Duration kTwoTenthsOfTheTransitionDuration = kMaterialPageRouteTransitionDuration * 0.2; final Duration kTwoTenthsOfTheTransitionDuration = kMaterialPageRouteTransitionDuration * 0.2;
final Duration kFourTenthsOfTheTransitionDuration = kMaterialPageRouteTransitionDuration * 0.4; final Duration kFourTenthsOfTheTransitionDuration = kMaterialPageRouteTransitionDuration * 0.4;
...@@ -57,30 +65,33 @@ void main() { ...@@ -57,30 +65,33 @@ void main() {
tester.pumpWidget( tester.pumpWidget(
new MaterialApp( new MaterialApp(
routes: <String, RouteBuilder>{ onGenerateRoute: (NamedRouteSettings settings) {
'/': (RouteArguments args) { switch (settings.name) {
return new Builder( case '/':
key: insideKey, return new TestRoute(
builder: (BuildContext context) { new Builder(
PageRoute route = ModalRoute.of(context); key: insideKey,
return new Column([ builder: (BuildContext context) {
new TestTransition( PageRoute route = ModalRoute.of(context);
childFirstHalf: new Text('A'), return new Column([
childSecondHalf: new Text('B'), new TestTransition(
performance: route.performance childFirstHalf: new Text('A'),
), childSecondHalf: new Text('B'),
new TestTransition( performance: route.performance
childFirstHalf: new Text('C'), ),
childSecondHalf: new Text('D'), new TestTransition(
performance: route.forwardPerformance childFirstHalf: new Text('C'),
), childSecondHalf: new Text('D'),
]); performance: route.forwardPerformance
} ),
); ]);
}, }
'/2': (RouteArguments args) => new Text('E'), )
'/3': (RouteArguments args) => new Text('F'), );
'/4': (RouteArguments args) => new Text('G'), case '/2': return new TestRoute(new Text('E'));
case '/3': return new TestRoute(new Text('F'));
case '/4': return new TestRoute(new Text('G'));
}
} }
) )
); );
......
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