Line data Source code
1 : import 'package:flutter/widgets.dart'; 2 : 3 : /// A no-animation transition delegate for [BeamerDelegate.transitionDelegate]. 4 : /// 5 : /// See example at https://api.flutter.dev/flutter/widgets/TransitionDelegate-class.html. 6 : class NoAnimationTransitionDelegate extends TransitionDelegate<void> { 7 : /// Creates a [NoAnimationTransitionDelegate]. 8 2 : const NoAnimationTransitionDelegate() : super(); 9 : 10 2 : @override 11 : Iterable<RouteTransitionRecord> resolve({ 12 : required List<RouteTransitionRecord> newPageRouteHistory, 13 : required Map<RouteTransitionRecord?, RouteTransitionRecord> 14 : locationToExitingPageRoute, 15 : required Map<RouteTransitionRecord?, List<RouteTransitionRecord>> 16 : pageRouteToPagelessRoutes, 17 : }) { 18 2 : final List<RouteTransitionRecord> results = <RouteTransitionRecord>[]; 19 : 20 4 : for (final RouteTransitionRecord pageRoute in newPageRouteHistory) { 21 2 : if (pageRoute.isWaitingForEnteringDecision) { 22 2 : pageRoute.markForAdd(); 23 : } 24 2 : results.add(pageRoute); 25 : } 26 : for (final RouteTransitionRecord exitingPageRoute 27 4 : in locationToExitingPageRoute.values) { 28 2 : if (exitingPageRoute.isWaitingForExitingDecision) { 29 2 : exitingPageRoute.markForRemove(); 30 : final List<RouteTransitionRecord>? pagelessRoutes = 31 2 : pageRouteToPagelessRoutes[exitingPageRoute]; 32 : if (pagelessRoutes != null) { 33 2 : for (final RouteTransitionRecord pagelessRoute in pagelessRoutes) { 34 1 : pagelessRoute.markForRemove(); 35 : } 36 : } 37 : } 38 2 : results.add(exitingPageRoute); 39 : } 40 : return results; 41 : } 42 : } 43 : 44 : /// A transition delegate that will look like pop, regardless of whether an action is actuallly a pop. 45 : /// 46 : /// New pages are added behind and then the remove animation on old pages is done. 47 : class ReverseTransitionDelegate extends TransitionDelegate<void> { 48 : /// Creates a [ReverseTransitionDelegate], 49 12 : const ReverseTransitionDelegate() : super(); 50 : 51 4 : @override 52 : Iterable<RouteTransitionRecord> resolve({ 53 : required List<RouteTransitionRecord> newPageRouteHistory, 54 : required Map<RouteTransitionRecord?, RouteTransitionRecord> 55 : locationToExitingPageRoute, 56 : required Map<RouteTransitionRecord?, List<RouteTransitionRecord>> 57 : pageRouteToPagelessRoutes, 58 : }) { 59 4 : final List<RouteTransitionRecord> results = <RouteTransitionRecord>[]; 60 : 61 4 : void handleExitingRoute(RouteTransitionRecord? location) { 62 : final RouteTransitionRecord? exitingPageRoute = 63 4 : locationToExitingPageRoute[location]; 64 : if (exitingPageRoute == null) return; 65 4 : if (exitingPageRoute.isWaitingForExitingDecision) { 66 : final bool hasPagelessRoute = 67 4 : pageRouteToPagelessRoutes.containsKey(exitingPageRoute); 68 12 : exitingPageRoute.markForPop(exitingPageRoute.route.currentResult); 69 : if (hasPagelessRoute) { 70 : final List<RouteTransitionRecord> pagelessRoutes = 71 1 : pageRouteToPagelessRoutes[exitingPageRoute]!; 72 2 : for (final RouteTransitionRecord pagelessRoute in pagelessRoutes) { 73 1 : if (pagelessRoute.isWaitingForExitingDecision) { 74 3 : pagelessRoute.markForPop(pagelessRoute.route.currentResult); 75 : } 76 : } 77 : } 78 : } 79 4 : results.add(exitingPageRoute); 80 : 81 : handleExitingRoute(exitingPageRoute); 82 : } 83 : 84 8 : for (final RouteTransitionRecord pageRoute in newPageRouteHistory) { 85 4 : if (pageRoute.isWaitingForEnteringDecision) { 86 4 : pageRoute.markForAdd(); 87 : } 88 4 : results.add(pageRoute); 89 : handleExitingRoute(pageRoute); 90 : } 91 : 92 : handleExitingRoute(null); 93 : 94 : return results; 95 : } 96 : }