Jonny Borges
Committed by GitHub

update to 3.2.2

  1 +## [3.2.2]
  2 +- Improve transitions and refactor route system
  3 +
1 ## [3.2.1] 4 ## [3.2.1]
2 - Prevent black blackground on cupertino fullscreenDialog 5 - Prevent black blackground on cupertino fullscreenDialog
3 6
@@ -62,7 +62,7 @@ class GetImpl implements GetService { @@ -62,7 +62,7 @@ class GetImpl implements GetService {
62 transition: transition ?? defaultTransition, 62 transition: transition ?? defaultTransition,
63 fullscreenDialog: fullscreenDialog, 63 fullscreenDialog: fullscreenDialog,
64 binding: binding, 64 binding: binding,
65 - duration: duration ?? defaultDurationTransition)); 65 + transitionDuration: duration ?? defaultDurationTransition));
66 } 66 }
67 67
68 /// It replaces Navigator.pushNamed, but needs no context, and it doesn't have the Navigator.pushNamed 68 /// It replaces Navigator.pushNamed, but needs no context, and it doesn't have the Navigator.pushNamed
@@ -195,7 +195,7 @@ class GetImpl implements GetService { @@ -195,7 +195,7 @@ class GetImpl implements GetService {
195 fullscreenDialog: fullscreenDialog, 195 fullscreenDialog: fullscreenDialog,
196 popGesture: popGesture ?? defaultPopGesture, 196 popGesture: popGesture ?? defaultPopGesture,
197 transition: transition ?? defaultTransition, 197 transition: transition ?? defaultTransition,
198 - duration: duration ?? defaultDurationTransition)); 198 + transitionDuration: duration ?? defaultDurationTransition));
199 } 199 }
200 200
201 /// It replaces Navigator.pushAndRemoveUntil, but needs no context 201 /// It replaces Navigator.pushAndRemoveUntil, but needs no context
@@ -221,7 +221,7 @@ class GetImpl implements GetService { @@ -221,7 +221,7 @@ class GetImpl implements GetService {
221 RouteSettings(name: '/${page.runtimeType}', arguments: arguments), 221 RouteSettings(name: '/${page.runtimeType}', arguments: arguments),
222 fullscreenDialog: fullscreenDialog, 222 fullscreenDialog: fullscreenDialog,
223 transition: transition ?? defaultTransition, 223 transition: transition ?? defaultTransition,
224 - duration: duration ?? defaultDurationTransition, 224 + transitionDuration: duration ?? defaultDurationTransition,
225 ), 225 ),
226 predicate ?? route); 226 predicate ?? route);
227 } 227 }
@@ -583,7 +583,7 @@ class GetImpl implements GetService { @@ -583,7 +583,7 @@ class GetImpl implements GetService {
583 583
584 ParseRouteTree routeTree; 584 ParseRouteTree routeTree;
585 585
586 - addPages(List<GetPage> getPages) { 586 + void addPages(List<GetPage> getPages) {
587 if (getPages != null) { 587 if (getPages != null) {
588 if (routeTree == null) routeTree = ParseRouteTree(); 588 if (routeTree == null) routeTree = ParseRouteTree();
589 getPages.forEach((element) { 589 getPages.forEach((element) {
@@ -592,7 +592,7 @@ class GetImpl implements GetService { @@ -592,7 +592,7 @@ class GetImpl implements GetService {
592 } 592 }
593 } 593 }
594 594
595 - addPage(GetPage getPage) { 595 + void addPage(GetPage getPage) {
596 if (getPage != null) { 596 if (getPage != null) {
597 if (routeTree == null) routeTree = ParseRouteTree(); 597 if (routeTree == null) routeTree = ParseRouteTree();
598 routeTree.addRoute(getPage); 598 routeTree.addRoute(getPage);
@@ -600,7 +600,7 @@ class GetImpl implements GetService { @@ -600,7 +600,7 @@ class GetImpl implements GetService {
600 } 600 }
601 601
602 /// change default config of Get 602 /// change default config of Get
603 - config( 603 + void config(
604 {bool enableLog, 604 {bool enableLog,
605 bool defaultPopGesture, 605 bool defaultPopGesture,
606 bool defaultOpaqueRoute, 606 bool defaultOpaqueRoute,
@@ -696,11 +696,11 @@ class GetImpl implements GetService { @@ -696,11 +696,11 @@ class GetImpl implements GetService {
696 696
697 Map<String, String> parameters = {}; 697 Map<String, String> parameters = {};
698 698
699 - setRouting(Routing rt) { 699 + void setRouting(Routing rt) {
700 _routing = rt; 700 _routing = rt;
701 } 701 }
702 702
703 - setSettings(RouteSettings settings) { 703 + void setSettings(RouteSettings settings) {
704 settings = settings; 704 settings = settings;
705 } 705 }
706 706
@@ -708,10 +708,10 @@ class GetImpl implements GetService { @@ -708,10 +708,10 @@ class GetImpl implements GetService {
708 Object get arguments => _routing.args; 708 Object get arguments => _routing.args;
709 709
710 /// give name from current route 710 /// give name from current route
711 - get currentRoute => _routing.current; 711 + String get currentRoute => _routing.current;
712 712
713 /// give name from previous route 713 /// give name from previous route
714 - get previousRoute => _routing.previous; 714 + String get previousRoute => _routing.previous;
715 715
716 /// check if snackbar is open 716 /// check if snackbar is open
717 bool get isSnackbarOpen => _routing.isSnackbar; 717 bool get isSnackbarOpen => _routing.isSnackbar;
@@ -747,10 +747,11 @@ class GetImpl implements GetService { @@ -747,10 +747,11 @@ class GetImpl implements GetService {
747 MediaQueryData get mediaQuery => MediaQuery.of(context); 747 MediaQueryData get mediaQuery => MediaQuery.of(context);
748 748
749 /// Check if dark mode theme is enable 749 /// Check if dark mode theme is enable
750 - get isDarkMode => (theme.brightness == Brightness.dark); 750 + bool get isDarkMode => (theme.brightness == Brightness.dark);
751 751
752 /// Check if dark mode theme is enable on platform on android Q+ 752 /// Check if dark mode theme is enable on platform on android Q+
753 - get isPlatformDarkMode => (mediaQuery.platformBrightness == Brightness.dark); 753 + bool get isPlatformDarkMode =>
  754 + (mediaQuery.platformBrightness == Brightness.dark);
754 755
755 /// give access to Theme.of(context).iconTheme.color 756 /// give access to Theme.of(context).iconTheme.color
756 Color get iconColor => Theme.of(context).iconTheme.color; 757 Color get iconColor => Theme.of(context).iconTheme.color;
@@ -124,7 +124,8 @@ class GetMaterialApp extends StatelessWidget { @@ -124,7 +124,8 @@ class GetMaterialApp extends StatelessWidget {
124 customTransition: match.route.customTransition, 124 customTransition: match.route.customTransition,
125 binding: unknownRoute.binding, 125 binding: unknownRoute.binding,
126 bindings: unknownRoute.bindings, 126 bindings: unknownRoute.bindings,
127 - duration: (transitionDuration ?? unknownRoute.transitionDuration), 127 + transitionDuration:
  128 + (transitionDuration ?? unknownRoute.transitionDuration),
128 transition: unknownRoute.transition, 129 transition: unknownRoute.transition,
129 popGesture: unknownRoute.popGesture, 130 popGesture: unknownRoute.popGesture,
130 fullscreenDialog: unknownRoute.fullscreenDialog, 131 fullscreenDialog: unknownRoute.fullscreenDialog,
@@ -141,7 +142,8 @@ class GetMaterialApp extends StatelessWidget { @@ -141,7 +142,8 @@ class GetMaterialApp extends StatelessWidget {
141 customTransition: match.route.customTransition, 142 customTransition: match.route.customTransition,
142 binding: match.route.binding, 143 binding: match.route.binding,
143 bindings: match.route.bindings, 144 bindings: match.route.bindings,
144 - duration: (transitionDuration ?? match.route.transitionDuration), 145 + transitionDuration:
  146 + (transitionDuration ?? match.route.transitionDuration),
145 transition: match.route.transition, 147 transition: match.route.transition,
146 popGesture: match.route.popGesture, 148 popGesture: match.route.popGesture,
147 fullscreenDialog: match.route.fullscreenDialog, 149 fullscreenDialog: match.route.fullscreenDialog,
@@ -161,7 +163,8 @@ class GetMaterialApp extends StatelessWidget { @@ -161,7 +163,8 @@ class GetMaterialApp extends StatelessWidget {
161 opaque: match.route.opaque, 163 opaque: match.route.opaque,
162 binding: match.route.binding, 164 binding: match.route.binding,
163 bindings: match.route.bindings, 165 bindings: match.route.bindings,
164 - duration: (transitionDuration ?? match.route.transitionDuration), 166 + transitionDuration:
  167 + (transitionDuration ?? match.route.transitionDuration),
165 transition: match.route.transition, 168 transition: match.route.transition,
166 popGesture: match.route.popGesture, 169 popGesture: match.route.popGesture,
167 fullscreenDialog: match.route.fullscreenDialog, 170 fullscreenDialog: match.route.fullscreenDialog,
1 abstract class Bindings { 1 abstract class Bindings {
2 - dependencies(); 2 + void dependencies();
3 } 3 }
4 4
5 // abstract class INavigation {} 5 // abstract class INavigation {}
@@ -5,42 +5,111 @@ import 'package:flutter/gestures.dart'; @@ -5,42 +5,111 @@ import 'package:flutter/gestures.dart';
5 import 'package:flutter/material.dart'; 5 import 'package:flutter/material.dart';
6 import 'package:get/src/get_main.dart'; 6 import 'package:get/src/get_main.dart';
7 import 'package:get/src/instance/get_instance.dart'; 7 import 'package:get/src/instance/get_instance.dart';
8 -import 'package:get/src/platform/platform.dart'; 8 +import 'package:get/utils.dart';
9 import 'bindings_interface.dart'; 9 import 'bindings_interface.dart';
10 import 'custom_transition.dart'; 10 import 'custom_transition.dart';
11 -import 'transitions_filter.dart'; 11 +import 'default_transitions.dart';
12 import 'transitions_type.dart'; 12 import 'transitions_type.dart';
13 13
14 -class GetPageRoute<T> extends PageRouteBuilder<T> {  
15 - //final TransitionComponent transitionComponent;  
16 - final Duration duration;  
17 - final bool popGesture;  
18 - final Transition transition;  
19 - final Curve curve;  
20 - final Alignment alignment;  
21 - final GetPageBuilder page;  
22 - final CustomTransition customTransition;  
23 - final Bindings binding;  
24 - final Map<String, String> parameter;  
25 - final List<Bindings> bindings;  
26 - 14 +class GetPageRoute<T> extends PageRoute<T> {
27 GetPageRoute({ 15 GetPageRoute({
28 - // this.transitionComponent,  
29 RouteSettings settings, 16 RouteSettings settings,
30 - this.duration,  
31 - this.transition,  
32 - this.binding,  
33 - @required this.page,  
34 - this.bindings, 17 + this.transitionDuration = const Duration(milliseconds: 400),
35 this.opaque = true, 18 this.opaque = true,
36 this.parameter, 19 this.parameter,
  20 + this.curve,
37 this.alignment, 21 this.alignment,
38 - this.fullscreenDialog = false,  
39 - this.curve = Curves.linear, 22 + this.transition,
40 this.popGesture, 23 this.popGesture,
41 this.customTransition, 24 this.customTransition,
42 - }) : super(  
43 - pageBuilder: (context, anim1, anim2) { 25 + this.barrierDismissible = false,
  26 + this.barrierColor,
  27 + this.binding,
  28 + this.bindings,
  29 + this.page,
  30 + this.barrierLabel,
  31 + this.maintainState = true,
  32 + bool fullscreenDialog = false,
  33 + }) : assert(opaque != null),
  34 + assert(barrierDismissible != null),
  35 + assert(maintainState != null),
  36 + assert(fullscreenDialog != null),
  37 + super(settings: settings, fullscreenDialog: fullscreenDialog);
  38 +
  39 + @override
  40 + final Duration transitionDuration;
  41 +
  42 + final GetPageBuilder page;
  43 +
  44 + final CustomTransition customTransition;
  45 +
  46 + final Bindings binding;
  47 +
  48 + final Map<String, String> parameter;
  49 +
  50 + final List<Bindings> bindings;
  51 +
  52 + @override
  53 + final bool opaque;
  54 +
  55 + final bool popGesture;
  56 +
  57 + @override
  58 + final bool barrierDismissible;
  59 +
  60 + final Transition transition;
  61 +
  62 + final Curve curve;
  63 +
  64 + final Alignment alignment;
  65 +
  66 + @override
  67 + final Color barrierColor;
  68 +
  69 + @override
  70 + final String barrierLabel;
  71 +
  72 + @override
  73 + final bool maintainState;
  74 +
  75 + @override
  76 + bool canTransitionTo(TransitionRoute<dynamic> nextRoute) {
  77 + // Don't perform outgoing animation if the next route is a fullscreen dialog.
  78 + return nextRoute is PageRoute && !nextRoute.fullscreenDialog;
  79 + }
  80 +
  81 + static bool _isPopGestureEnabled<T>(PageRoute<T> route) {
  82 + if (route.isFirst) return false;
  83 +
  84 + if (route.willHandlePopInternally) return false;
  85 +
  86 + if (route.hasScopedWillPopCallback) return false;
  87 +
  88 + if (route.fullscreenDialog) return false;
  89 +
  90 + if (route.animation.status != AnimationStatus.completed) return false;
  91 +
  92 + if (route.secondaryAnimation.status != AnimationStatus.dismissed)
  93 + return false;
  94 +
  95 + if (isPopGestureInProgress(route)) return false;
  96 +
  97 + return true;
  98 + }
  99 +
  100 + static _CupertinoBackGestureController<T> _startPopGesture<T>(
  101 + PageRoute<T> route) {
  102 + assert(_isPopGestureEnabled(route));
  103 +
  104 + return _CupertinoBackGestureController<T>(
  105 + navigator: route.navigator,
  106 + controller: route.controller,
  107 + );
  108 + }
  109 +
  110 + @override
  111 + Widget buildPage(BuildContext context, Animation<double> animation,
  112 + Animation<double> secondaryAnimation) {
44 if (binding != null) { 113 if (binding != null) {
45 binding.dependencies(); 114 binding.dependencies();
46 } 115 }
@@ -51,15 +120,7 @@ class GetPageRoute<T> extends PageRouteBuilder<T> { @@ -51,15 +120,7 @@ class GetPageRoute<T> extends PageRouteBuilder<T> {
51 } 120 }
52 GetConfig.currentRoute = settings.name; 121 GetConfig.currentRoute = settings.name;
53 return page(); 122 return page();
54 - },  
55 - settings: settings,  
56 - );  
57 -  
58 - @override  
59 - final bool opaque;  
60 -  
61 - @override  
62 - final bool fullscreenDialog; 123 + }
63 124
64 static bool isPopGestureInProgress(PageRoute<dynamic> route) { 125 static bool isPopGestureInProgress(PageRoute<dynamic> route) {
65 return route.navigator.userGestureInProgress; 126 return route.navigator.userGestureInProgress;
@@ -68,24 +129,14 @@ class GetPageRoute<T> extends PageRouteBuilder<T> { @@ -68,24 +129,14 @@ class GetPageRoute<T> extends PageRouteBuilder<T> {
68 bool get popGestureInProgress => isPopGestureInProgress(this); 129 bool get popGestureInProgress => isPopGestureInProgress(this);
69 130
70 @override 131 @override
71 - bool canTransitionTo(TransitionRoute<dynamic> nextRoute) {  
72 - // Don't perform outgoing animation if the next route is a fullscreen dialog.  
73 - return nextRoute is GetPageRoute && !nextRoute.fullscreenDialog;  
74 - }  
75 -  
76 - @override  
77 Widget buildTransitions(BuildContext context, Animation<double> animation, 132 Widget buildTransitions(BuildContext context, Animation<double> animation,
78 Animation<double> secondaryAnimation, Widget child) { 133 Animation<double> secondaryAnimation, Widget child) {
79 - if (fullscreenDialog != null &&  
80 - transition == null &&  
81 - customTransition == null) {  
82 - final bool linearTransition = isPopGestureInProgress(this); 134 + if (fullscreenDialog && transition == null) {
83 return CupertinoFullscreenDialogTransition( 135 return CupertinoFullscreenDialogTransition(
84 primaryRouteAnimation: animation, 136 primaryRouteAnimation: animation,
85 secondaryRouteAnimation: secondaryAnimation, 137 secondaryRouteAnimation: secondaryAnimation,
86 child: child, 138 child: child,
87 - linearTransition: linearTransition,  
88 - ); 139 + linearTransition: true);
89 } 140 }
90 141
91 if (this.customTransition != null) { 142 if (this.customTransition != null) {
@@ -102,14 +153,10 @@ class GetPageRoute<T> extends PageRouteBuilder<T> { @@ -102,14 +153,10 @@ class GetPageRoute<T> extends PageRouteBuilder<T> {
102 child: child) 153 child: child)
103 : child); 154 : child);
104 } 155 }
105 - final curvedAnimation = CurvedAnimation(  
106 - parent: animation,  
107 - curve: this.curve ?? Curves.linear,  
108 - );  
109 156
110 - if (transition == null) {  
111 - if (Get.customTransition != null) {  
112 - return Get.customTransition.buildTransition( 157 + switch (transition ?? Get.defaultTransition) {
  158 + case Transition.leftToRight:
  159 + return SlideLeftTransition().buildTransitions(
113 context, 160 context,
114 curve, 161 curve,
115 alignment, 162 alignment,
@@ -121,15 +168,13 @@ class GetPageRoute<T> extends PageRouteBuilder<T> { @@ -121,15 +168,13 @@ class GetPageRoute<T> extends PageRouteBuilder<T> {
121 onStartPopGesture: () => _startPopGesture<T>(this), 168 onStartPopGesture: () => _startPopGesture<T>(this),
122 child: child) 169 child: child)
123 : child); 170 : child);
124 - }  
125 171
126 - if (Get.defaultTransition != null) {  
127 - return TransitionFilter.newTransitionComponent(Get.defaultTransition)  
128 - .buildChildWithTransition( 172 + case Transition.downToUp:
  173 + return SlideDownTransition().buildTransitions(
129 context, 174 context,
130 curve, 175 curve,
131 alignment, 176 alignment,
132 - curvedAnimation, 177 + animation,
133 secondaryAnimation, 178 secondaryAnimation,
134 popGesture ?? Get.defaultPopGesture 179 popGesture ?? Get.defaultPopGesture
135 ? _CupertinoBackGestureDetector<T>( 180 ? _CupertinoBackGestureDetector<T>(
@@ -137,27 +182,27 @@ class GetPageRoute<T> extends PageRouteBuilder<T> { @@ -137,27 +182,27 @@ class GetPageRoute<T> extends PageRouteBuilder<T> {
137 onStartPopGesture: () => _startPopGesture<T>(this), 182 onStartPopGesture: () => _startPopGesture<T>(this),
138 child: child) 183 child: child)
139 : child); 184 : child);
140 - }  
141 185
142 - return Theme.of(context).pageTransitionsTheme.buildTransitions(  
143 - this, 186 + case Transition.upToDown:
  187 + return SlideTopTransition().buildTransitions(
144 context, 188 context,
  189 + curve,
  190 + alignment,
145 animation, 191 animation,
146 secondaryAnimation, 192 secondaryAnimation,
147 - GetPlatform.isIOS 193 + popGesture ?? Get.defaultPopGesture
148 ? _CupertinoBackGestureDetector<T>( 194 ? _CupertinoBackGestureDetector<T>(
149 enabledCallback: () => _isPopGestureEnabled<T>(this), 195 enabledCallback: () => _isPopGestureEnabled<T>(this),
150 onStartPopGesture: () => _startPopGesture<T>(this), 196 onStartPopGesture: () => _startPopGesture<T>(this),
151 child: child) 197 child: child)
152 : child); 198 : child);
153 - }  
154 199
155 - return TransitionFilter.newTransitionComponent(transition)  
156 - .buildChildWithTransition( 200 + case Transition.rightToLeft:
  201 + return SlideRightTransition().buildTransitions(
157 context, 202 context,
158 curve, 203 curve,
159 alignment, 204 alignment,
160 - curvedAnimation, 205 + animation,
161 secondaryAnimation, 206 secondaryAnimation,
162 popGesture ?? Get.defaultPopGesture 207 popGesture ?? Get.defaultPopGesture
163 ? _CupertinoBackGestureDetector<T>( 208 ? _CupertinoBackGestureDetector<T>(
@@ -165,39 +210,173 @@ class GetPageRoute<T> extends PageRouteBuilder<T> { @@ -165,39 +210,173 @@ class GetPageRoute<T> extends PageRouteBuilder<T> {
165 onStartPopGesture: () => _startPopGesture<T>(this), 210 onStartPopGesture: () => _startPopGesture<T>(this),
166 child: child) 211 child: child)
167 : child); 212 : child);
168 - }  
169 213
170 - @override  
171 - Duration get transitionDuration =>  
172 - this.duration ?? Duration(milliseconds: 400); 214 + case Transition.zoom:
  215 + return ZoomInTransition().buildTransitions(
  216 + context,
  217 + curve,
  218 + alignment,
  219 + animation,
  220 + secondaryAnimation,
  221 + popGesture ?? Get.defaultPopGesture
  222 + ? _CupertinoBackGestureDetector<T>(
  223 + enabledCallback: () => _isPopGestureEnabled<T>(this),
  224 + onStartPopGesture: () => _startPopGesture<T>(this),
  225 + child: child)
  226 + : child);
173 227
174 - static bool _isPopGestureEnabled<T>(PageRoute<T> route) {  
175 - if (route.isFirst) return false; 228 + case Transition.fadeIn:
  229 + return FadeInTransition().buildTransitions(
  230 + context,
  231 + curve,
  232 + alignment,
  233 + animation,
  234 + secondaryAnimation,
  235 + popGesture ?? Get.defaultPopGesture
  236 + ? _CupertinoBackGestureDetector<T>(
  237 + enabledCallback: () => _isPopGestureEnabled<T>(this),
  238 + onStartPopGesture: () => _startPopGesture<T>(this),
  239 + child: child)
  240 + : child);
176 241
177 - if (route.willHandlePopInternally) return false; 242 + case Transition.rightToLeftWithFade:
  243 + return RightToLeftFadeTransition().buildTransitions(
  244 + context,
  245 + curve,
  246 + alignment,
  247 + animation,
  248 + secondaryAnimation,
  249 + popGesture ?? Get.defaultPopGesture
  250 + ? _CupertinoBackGestureDetector<T>(
  251 + enabledCallback: () => _isPopGestureEnabled<T>(this),
  252 + onStartPopGesture: () => _startPopGesture<T>(this),
  253 + child: child)
  254 + : child);
178 255
179 - if (route.hasScopedWillPopCallback) return false; 256 + case Transition.leftToRightWithFade:
  257 + return LeftToRightFadeTransition().buildTransitions(
  258 + context,
  259 + curve,
  260 + alignment,
  261 + animation,
  262 + secondaryAnimation,
  263 + popGesture ?? Get.defaultPopGesture
  264 + ? _CupertinoBackGestureDetector<T>(
  265 + enabledCallback: () => _isPopGestureEnabled<T>(this),
  266 + onStartPopGesture: () => _startPopGesture<T>(this),
  267 + child: child)
  268 + : child);
180 269
181 - if (route.fullscreenDialog) return false; 270 + case Transition.cupertino:
  271 + return CupertinoTransitions().buildTransitions(
  272 + context,
  273 + curve,
  274 + alignment,
  275 + animation,
  276 + secondaryAnimation,
  277 + popGesture ?? Get.defaultPopGesture
  278 + ? _CupertinoBackGestureDetector<T>(
  279 + enabledCallback: () => _isPopGestureEnabled<T>(this),
  280 + onStartPopGesture: () => _startPopGesture<T>(this),
  281 + child: child)
  282 + : child);
182 283
183 - if (route.animation.status != AnimationStatus.completed) return false; 284 + case Transition.size:
  285 + return SizeTransitions().buildTransitions(
  286 + context,
  287 + curve,
  288 + alignment,
  289 + animation,
  290 + secondaryAnimation,
  291 + popGesture ?? Get.defaultPopGesture
  292 + ? _CupertinoBackGestureDetector<T>(
  293 + enabledCallback: () => _isPopGestureEnabled<T>(this),
  294 + onStartPopGesture: () => _startPopGesture<T>(this),
  295 + child: child)
  296 + : child);
184 297
185 - if (route.secondaryAnimation.status != AnimationStatus.dismissed)  
186 - return false; 298 + case Transition.fade:
  299 + return FadeUpwardsPageTransitionsBuilder().buildTransitions(
  300 + this,
  301 + context,
  302 + animation,
  303 + secondaryAnimation,
  304 + popGesture ?? Get.defaultPopGesture
  305 + ? _CupertinoBackGestureDetector<T>(
  306 + enabledCallback: () => _isPopGestureEnabled<T>(this),
  307 + onStartPopGesture: () => _startPopGesture<T>(this),
  308 + child: child)
  309 + : child);
187 310
188 - if (isPopGestureInProgress(route)) return false; 311 + case Transition.topLevel:
  312 + return ZoomPageTransitionsBuilder().buildTransitions(
  313 + this,
  314 + context,
  315 + animation,
  316 + secondaryAnimation,
  317 + popGesture ?? Get.defaultPopGesture
  318 + ? _CupertinoBackGestureDetector<T>(
  319 + enabledCallback: () => _isPopGestureEnabled<T>(this),
  320 + onStartPopGesture: () => _startPopGesture<T>(this),
  321 + child: child)
  322 + : child);
189 323
190 - return true;  
191 - } 324 + case Transition.native:
  325 + if (GetPlatform.isIOS)
  326 + return CupertinoTransitions().buildTransitions(
  327 + context,
  328 + curve,
  329 + alignment,
  330 + animation,
  331 + secondaryAnimation,
  332 + popGesture ?? Get.defaultPopGesture
  333 + ? _CupertinoBackGestureDetector<T>(
  334 + enabledCallback: () => _isPopGestureEnabled<T>(this),
  335 + onStartPopGesture: () => _startPopGesture<T>(this),
  336 + child: child)
  337 + : child);
192 338
193 - static _CupertinoBackGestureController<T> _startPopGesture<T>(  
194 - PageRoute<T> route) {  
195 - assert(_isPopGestureEnabled(route)); 339 + return FadeInTransition().buildTransitions(
  340 + context,
  341 + curve,
  342 + alignment,
  343 + animation,
  344 + secondaryAnimation,
  345 + popGesture ?? Get.defaultPopGesture
  346 + ? _CupertinoBackGestureDetector<T>(
  347 + enabledCallback: () => _isPopGestureEnabled<T>(this),
  348 + onStartPopGesture: () => _startPopGesture<T>(this),
  349 + child: child)
  350 + : child);
196 351
197 - return _CupertinoBackGestureController<T>(  
198 - navigator: route.navigator,  
199 - controller: route.controller,  
200 - ); 352 + default:
  353 + if (GetPlatform.isIOS)
  354 + return CupertinoTransitions().buildTransitions(
  355 + context,
  356 + curve,
  357 + alignment,
  358 + animation,
  359 + secondaryAnimation,
  360 + popGesture ?? Get.defaultPopGesture
  361 + ? _CupertinoBackGestureDetector<T>(
  362 + enabledCallback: () => _isPopGestureEnabled<T>(this),
  363 + onStartPopGesture: () => _startPopGesture<T>(this),
  364 + child: child)
  365 + : child);
  366 +
  367 + return FadeInTransition().buildTransitions(
  368 + context,
  369 + curve,
  370 + alignment,
  371 + animation,
  372 + secondaryAnimation,
  373 + popGesture ?? Get.defaultPopGesture
  374 + ? _CupertinoBackGestureDetector<T>(
  375 + enabledCallback: () => _isPopGestureEnabled<T>(this),
  376 + onStartPopGesture: () => _startPopGesture<T>(this),
  377 + child: child)
  378 + : child);
  379 + }
201 } 380 }
202 } 381 }
203 382
@@ -410,655 +589,3 @@ class _CupertinoBackGestureController<T> { @@ -410,655 +589,3 @@ class _CupertinoBackGestureController<T> {
410 } 589 }
411 } 590 }
412 } 591 }
413 -  
414 -// import 'package:flutter/cupertino.dart';  
415 -// import 'package:flutter/foundation.dart';  
416 -// import 'package:flutter/gestures.dart';  
417 -// import 'package:flutter/material.dart';  
418 -// import 'package:get/src/get_main.dart';  
419 -// import 'package:get/src/routes/bindings_interface.dart';  
420 -  
421 -// import '../platform/platform.dart';  
422 -// import 'transitions_type.dart';  
423 -  
424 -// const double _kBackGestureWidth = 20.0;  
425 -// const double _kMinFlingVelocity = 1.0;  
426 -// const int _kMaxDroppedSwipePageForwardAnimationTime = 800; // Milliseconds.  
427 -  
428 -// // The maximum time for a page to get reset to it's original position if the  
429 -// // user releases a page mid swipe.  
430 -// const int _kMaxPageBackAnimationTime = 300;  
431 -  
432 -// class GetPageRoute<T> extends PageRoute<T> {  
433 -// /// The [builder], [maintainState], and [fullscreenDialog] arguments must not  
434 -// /// be null.  
435 -// GetPageRoute({  
436 -// @required this.page,  
437 -// this.title,  
438 -// RouteSettings settings,  
439 -// this.maintainState = true,  
440 -// this.curve = Curves.linear,  
441 -// this.alignment,  
442 -// this.parameter,  
443 -// this.binding,  
444 -// this.route,  
445 -// this.bindings,  
446 -// this.customBuildPageTransitions,  
447 -// this.opaque = true,  
448 -// this.transitionDuration = const Duration(milliseconds: 400),  
449 -// this.popGesture,  
450 -// this.transition,  
451 -// // this.duration = const Duration(milliseconds: 400),  
452 -// bool fullscreenDialog = false,  
453 -// }) : // assert(page != null),  
454 -// assert(maintainState != null),  
455 -// assert(fullscreenDialog != null),  
456 -// // assert(opaque),  
457 -// super(settings: settings, fullscreenDialog: fullscreenDialog) {  
458 -// /// prebuild dependencies  
459 -// if (binding != null) {  
460 -// binding.dependencies();  
461 -// }  
462 -// if (bindings != null) {  
463 -// bindings.forEach((element) => element.dependencies());  
464 -// }  
465 -// }  
466 -  
467 -// /// Builds the primary contents of the route.  
468 -// final Widget page;  
469 -  
470 -// final GetPageBuilder route;  
471 -  
472 -// final Widget customBuildPageTransitions;  
473 -  
474 -// final bool popGesture;  
475 -  
476 -// final Bindings binding;  
477 -  
478 -// final List<Bindings> bindings;  
479 -  
480 -// // final Duration duration;  
481 -  
482 -// final Map<String, String> parameter;  
483 -  
484 -// final String title;  
485 -  
486 -// final Transition transition;  
487 -  
488 -// final Curve curve;  
489 -  
490 -// final Alignment alignment;  
491 -  
492 -// ValueNotifier<String> _previousTitle;  
493 -  
494 -// /// The title string of the previous [GetRoute].  
495 -// ///  
496 -// /// The [ValueListenable]'s value is readable after the route is installed  
497 -// /// onto a [Navigator]. The [ValueListenable] will also notify its listeners  
498 -// /// if the value changes (such as by replacing the previous route).  
499 -// ///  
500 -// /// The [ValueListenable] itself will be null before the route is installed.  
501 -// /// Its content value will be null if the previous route has no title or  
502 -// /// is not a [GetRoute].  
503 -// ///  
504 -// /// See also:  
505 -// ///  
506 -// /// * [ValueListenableBuilder], which can be used to listen and rebuild  
507 -// /// widgets based on a ValueListenable.  
508 -// ValueListenable<String> get previousTitle {  
509 -// assert(  
510 -// _previousTitle != null,  
511 -// 'Cannot read the previousTitle for a route that has not yet been installed',  
512 -// );  
513 -// return _previousTitle;  
514 -// }  
515 -  
516 -// @override  
517 -// void didChangePrevious(Route<dynamic> previousRoute) {  
518 -// final String previousTitleString =  
519 -// previousRoute is GetPageRoute ? previousRoute.title : null;  
520 -// if (_previousTitle == null) {  
521 -// _previousTitle = ValueNotifier<String>(previousTitleString);  
522 -// } else {  
523 -// _previousTitle.value = previousTitleString;  
524 -// }  
525 -// super.didChangePrevious(previousRoute);  
526 -// }  
527 -  
528 -// @override  
529 -// final bool maintainState;  
530 -  
531 -// /// Allows you to set opaque to false to prevent route reconstruction.  
532 -// @override  
533 -// final bool opaque;  
534 -  
535 -// @override  
536 -// final Duration transitionDuration;  
537 -  
538 -// @override  
539 -// Color get barrierColor => null; //Color(0x00FFFFFF);  
540 -  
541 -// @override  
542 -// String get barrierLabel => null;  
543 -  
544 -// @override  
545 -// bool canTransitionTo(TransitionRoute<dynamic> nextRoute) {  
546 -// // Don't perform outgoing animation if the next route is a fullscreen dialog.  
547 -// return nextRoute is GetPageRoute && !nextRoute.fullscreenDialog;  
548 -// }  
549 -  
550 -// /// True if an iOS-style back swipe pop gesture is currently underway for [route].  
551 -// ///  
552 -// /// This just check the route's [NavigatorState.userGestureInProgress].  
553 -// ///  
554 -// /// See also:  
555 -// ///  
556 -// /// * [popGestureEnabled], which returns true if a user-triggered pop gesture  
557 -// /// would be allowed.  
558 -// static bool isPopGestureInProgress(PageRoute<dynamic> route) {  
559 -// return route.navigator.userGestureInProgress;  
560 -// }  
561 -  
562 -// /// True if an iOS-style back swipe pop gesture is currently underway for this route.  
563 -// ///  
564 -// /// See also:  
565 -// ///  
566 -// /// * [isPopGestureInProgress], which returns true if a Cupertino pop gesture  
567 -// /// is currently underway for specific route.  
568 -// /// * [popGestureEnabled], which returns true if a user-triggered pop gesture  
569 -// /// would be allowed.  
570 -// bool get popGestureInProgress => isPopGestureInProgress(this);  
571 -  
572 -// /// Whether a pop gesture can be started by the user.  
573 -// ///  
574 -// /// Returns true if the user can edge-swipe to a previous route.  
575 -// ///  
576 -// /// Returns false once [isPopGestureInProgress] is true, but  
577 -// /// [isPopGestureInProgress] can only become true if [popGestureEnabled] was  
578 -// /// true first.  
579 -// ///  
580 -// /// This should only be used between frames, not during build.  
581 -// bool get popGestureEnabled => _isPopGestureEnabled(this);  
582 -  
583 -// static bool _isPopGestureEnabled<T>(PageRoute<T> route) {  
584 -// // If there's nothing to go back to, then obviously we don't support  
585 -// // the back gesture.  
586 -// if (route.isFirst) return false;  
587 -// // If the route wouldn't actually pop if we popped it, then the gesture  
588 -// // would be really confusing (or would skip internal routes), so disallow it.  
589 -// if (route.willHandlePopInternally) return false;  
590 -// // If attempts to dismiss this route might be vetoed such as in a page  
591 -// // with forms, then do not allow the user to dismiss the route with a swipe.  
592 -// if (route.hasScopedWillPopCallback) return false;  
593 -// // Fullscreen dialogs aren't dismissible by back swipe.  
594 -// if (route.fullscreenDialog) return false;  
595 -// // If we're in an animation already, we cannot be manually swiped.  
596 -// if (route.animation.status != AnimationStatus.completed) return false;  
597 -// // If we're being popped into, we also cannot be swiped until the pop above  
598 -// // it completes. This translates to our secondary animation being  
599 -// // dismissed.  
600 -// if (route.secondaryAnimation.status != AnimationStatus.dismissed)  
601 -// return false;  
602 -// // If we're in a gesture already, we cannot start another.  
603 -// if (isPopGestureInProgress(route)) return false;  
604 -  
605 -// // Looks like a back gesture would be welcome!  
606 -// return true;  
607 -// }  
608 -  
609 -// @override  
610 -// Widget buildPage(BuildContext context, Animation<double> animation,  
611 -// Animation<double> secondaryAnimation) {  
612 -// final Widget result = Semantics(  
613 -// scopesRoute: true,  
614 -// explicitChildNodes: true,  
615 -// child: (route == null ? page : route()),  
616 -// );  
617 -// assert(() {  
618 -// if (route == null && page == null) {  
619 -// throw FlutterError.fromParts(<DiagnosticsNode>[  
620 -// ErrorSummary(  
621 -// 'The builder for route "${settings.name}" returned null.'),  
622 -// ErrorDescription('Route builders must never return null.'),  
623 -// ]);  
624 -// }  
625 -// return true;  
626 -// }());  
627 -// return result;  
628 -// }  
629 -  
630 -// // Called by _CupertinoBackGestureDetector when a pop ("back") drag start  
631 -// // gesture is detected. The returned controller handles all of the subsequent  
632 -// // drag events.  
633 -// static _CupertinoBackGestureController<T> _startPopGesture<T>(  
634 -// PageRoute<T> route) {  
635 -// assert(_isPopGestureEnabled(route));  
636 -  
637 -// return _CupertinoBackGestureController<T>(  
638 -// navigator: route.navigator,  
639 -// controller: route.controller, // protected access  
640 -// );  
641 -// }  
642 -  
643 -// /// Returns a [CupertinoFullscreenDialogTransition] if [route] is a full  
644 -// /// screen dialog, otherwise a [CupertinoPageTransition] is returned.  
645 -// ///  
646 -// /// Used by [GetRoute.buildTransitions].  
647 -// ///  
648 -// /// This method can be applied to any [PageRoute], not just  
649 -// /// [GetRoute]. It's typically used to provide a Cupertino style  
650 -// /// horizontal transition for material widgets when the target platform  
651 -// /// is [TargetPlatform.iOS].  
652 -// ///  
653 -// /// See also:  
654 -// ///  
655 -// /// * [CupertinoPageTransitionsBuilder], which uses this method to define a  
656 -// /// [PageTransitionsBuilder] for the [PageTransitionsTheme].  
657 -// Widget buildPageTransitions<T>(  
658 -// PageRoute<T> route,  
659 -// BuildContext context,  
660 -// bool popGesture,  
661 -// Animation<double> animation,  
662 -// Animation<double> secondaryAnimation,  
663 -// Widget child,  
664 -// Transition tr,  
665 -// Curve curve,  
666 -// Alignment alignment,  
667 -// ) {  
668 -// Transition transition = (tr ?? Get.defaultTransition);  
669 -  
670 -// if (route.fullscreenDialog) {  
671 -// final bool linearTransition = isPopGestureInProgress(route);  
672 -// return CupertinoFullscreenDialogTransition(  
673 -// primaryRouteAnimation: animation,  
674 -// secondaryRouteAnimation: secondaryAnimation,  
675 -// child: child,  
676 -// linearTransition: linearTransition,  
677 -// );  
678 -// } else {  
679 -// switch (transition) {  
680 -// case Transition.fade:  
681 -// final PageTransitionsBuilder matchingBuilder =  
682 -// FadeUpwardsPageTransitionsBuilder();  
683 -// return matchingBuilder.buildTransitions<T>(  
684 -// route,  
685 -// context,  
686 -// animation,  
687 -// secondaryAnimation,  
688 -// popGesture  
689 -// ? _CupertinoBackGestureDetector<T>(  
690 -// enabledCallback: () => _isPopGestureEnabled<T>(route),  
691 -// onStartPopGesture: () => _startPopGesture<T>(route),  
692 -// child: child)  
693 -// : child);  
694 -// break;  
695 -// case Transition.rightToLeft:  
696 -// return SlideTransition(  
697 -// transformHitTests: false,  
698 -// position: new Tween<Offset>(  
699 -// begin: const Offset(1.0, 0.0),  
700 -// end: Offset.zero,  
701 -// ).animate(animation),  
702 -// child: new SlideTransition(  
703 -// position: new Tween<Offset>(  
704 -// begin: Offset.zero,  
705 -// end: const Offset(-1.0, 0.0),  
706 -// ).animate(secondaryAnimation),  
707 -// child: popGesture  
708 -// ? _CupertinoBackGestureDetector<T>(  
709 -// enabledCallback: () => _isPopGestureEnabled<T>(route),  
710 -// onStartPopGesture: () => _startPopGesture<T>(route),  
711 -// child: child)  
712 -// : child),  
713 -// );  
714 -// break;  
715 -// case Transition.leftToRight:  
716 -// return SlideTransition(  
717 -// transformHitTests: false,  
718 -// position: Tween<Offset>(  
719 -// begin: const Offset(-1.0, 0.0),  
720 -// end: Offset.zero,  
721 -// ).animate(animation),  
722 -// child: new SlideTransition(  
723 -// position: new Tween<Offset>(  
724 -// begin: Offset.zero,  
725 -// end: const Offset(1.0, 0.0),  
726 -// ).animate(secondaryAnimation),  
727 -// child: popGesture  
728 -// ? _CupertinoBackGestureDetector<T>(  
729 -// enabledCallback: () => _isPopGestureEnabled<T>(route),  
730 -// onStartPopGesture: () => _startPopGesture<T>(route),  
731 -// child: child)  
732 -// : child),  
733 -// );  
734 -// break;  
735 -// case Transition.upToDown:  
736 -// return SlideTransition(  
737 -// transformHitTests: false,  
738 -// position: Tween<Offset>(  
739 -// begin: const Offset(0.0, -1.0),  
740 -// end: Offset.zero,  
741 -// ).animate(animation),  
742 -// child: new SlideTransition(  
743 -// position: new Tween<Offset>(  
744 -// begin: Offset.zero,  
745 -// end: const Offset(0.0, 1.0),  
746 -// ).animate(secondaryAnimation),  
747 -// child: popGesture  
748 -// ? _CupertinoBackGestureDetector<T>(  
749 -// enabledCallback: () => _isPopGestureEnabled<T>(route),  
750 -// onStartPopGesture: () => _startPopGesture<T>(route),  
751 -// child: child)  
752 -// : child),  
753 -// );  
754 -// break;  
755 -// case Transition.downToUp:  
756 -// return SlideTransition(  
757 -// transformHitTests: false,  
758 -// position: Tween<Offset>(  
759 -// begin: const Offset(0.0, 1.0),  
760 -// end: Offset.zero,  
761 -// ).animate(animation),  
762 -// child: new SlideTransition(  
763 -// position: new Tween<Offset>(  
764 -// begin: Offset.zero,  
765 -// end: const Offset(0.0, -1.0),  
766 -// ).animate(secondaryAnimation),  
767 -// child: popGesture  
768 -// ? _CupertinoBackGestureDetector<T>(  
769 -// enabledCallback: () => _isPopGestureEnabled<T>(route),  
770 -// onStartPopGesture: () => _startPopGesture<T>(route),  
771 -// child: child)  
772 -// : child),  
773 -// );  
774 -// break;  
775 -  
776 -// case Transition.rightToLeftWithFade:  
777 -// return SlideTransition(  
778 -// position: Tween<Offset>(  
779 -// begin: const Offset(1.0, 0.0),  
780 -// end: Offset.zero,  
781 -// ).animate(animation),  
782 -// child: FadeTransition(  
783 -// opacity: animation,  
784 -// child: SlideTransition(  
785 -// position: Tween<Offset>(  
786 -// begin: Offset.zero,  
787 -// end: const Offset(-1.0, 0.0),  
788 -// ).animate(secondaryAnimation),  
789 -// child: popGesture  
790 -// ? _CupertinoBackGestureDetector<T>(  
791 -// enabledCallback: () => _isPopGestureEnabled<T>(route),  
792 -// onStartPopGesture: () => _startPopGesture<T>(route),  
793 -// child: child)  
794 -// : child),  
795 -// ),  
796 -// );  
797 -// break;  
798 -// case Transition.leftToRightWithFade:  
799 -// return SlideTransition(  
800 -// position: Tween<Offset>(  
801 -// begin: const Offset(-1.0, 0.0),  
802 -// end: Offset.zero,  
803 -// ).animate(animation),  
804 -// child: FadeTransition(  
805 -// opacity: animation,  
806 -// child: SlideTransition(  
807 -// position: Tween<Offset>(  
808 -// begin: Offset.zero,  
809 -// end: const Offset(1.0, 0.0),  
810 -// ).animate(secondaryAnimation),  
811 -// child: popGesture  
812 -// ? _CupertinoBackGestureDetector<T>(  
813 -// enabledCallback: () => _isPopGestureEnabled<T>(route),  
814 -// onStartPopGesture: () => _startPopGesture<T>(route),  
815 -// child: child)  
816 -// : child),  
817 -// ),  
818 -// );  
819 -// break;  
820 -  
821 -// default:  
822 -// return CupertinoPageTransition(  
823 -// primaryRouteAnimation: animation,  
824 -// secondaryRouteAnimation: secondaryAnimation,  
825 -// // Check if the route has an animation that's currently participating  
826 -// // in a back swipe gesture.  
827 -// //  
828 -// // In the middle of a back gesture drag, let the transition be linear to  
829 -// // match finger motions.  
830 -// linearTransition: isPopGestureInProgress(route),  
831 -// child: popGesture  
832 -// ? _CupertinoBackGestureDetector<T>(  
833 -// enabledCallback: () => _isPopGestureEnabled<T>(route),  
834 -// onStartPopGesture: () => _startPopGesture<T>(route),  
835 -// child: child)  
836 -// : child,  
837 -// );  
838 -// }  
839 -// }  
840 -// }  
841 -  
842 -// @override  
843 -// Widget buildTransitions(BuildContext context, Animation<double> animation,  
844 -// Animation<double> secondaryAnimation, Widget child) {  
845 -// if (customBuildPageTransitions != null) {  
846 -// return customBuildPageTransitions;  
847 -// } else {  
848 -// return buildPageTransitions<T>(  
849 -// this,  
850 -// context,  
851 -// popGesture ?? GetPlatform.isIOS,  
852 -// animation,  
853 -// secondaryAnimation,  
854 -// child,  
855 -// transition,  
856 -// curve,  
857 -// alignment);  
858 -// }  
859 -// }  
860 -  
861 -// @override  
862 -// String get debugLabel => '${super.debugLabel}(${settings.name})';  
863 -// }  
864 -  
865 -// class _CupertinoBackGestureDetector<T> extends StatefulWidget {  
866 -// const _CupertinoBackGestureDetector({  
867 -// Key key,  
868 -// @required this.enabledCallback,  
869 -// @required this.onStartPopGesture,  
870 -// @required this.child,  
871 -// }) : assert(enabledCallback != null),  
872 -// assert(onStartPopGesture != null),  
873 -// assert(child != null),  
874 -// super(key: key);  
875 -  
876 -// final Widget child;  
877 -  
878 -// final ValueGetter<bool> enabledCallback;  
879 -  
880 -// final ValueGetter<_CupertinoBackGestureController<T>> onStartPopGesture;  
881 -  
882 -// @override  
883 -// _CupertinoBackGestureDetectorState<T> createState() =>  
884 -// _CupertinoBackGestureDetectorState<T>();  
885 -// }  
886 -  
887 -// class _CupertinoBackGestureDetectorState<T>  
888 -// extends State<_CupertinoBackGestureDetector<T>> {  
889 -// _CupertinoBackGestureController<T> _backGestureController;  
890 -  
891 -// HorizontalDragGestureRecognizer _recognizer;  
892 -  
893 -// @override  
894 -// void initState() {  
895 -// super.initState();  
896 -// _recognizer = HorizontalDragGestureRecognizer(debugOwner: this)  
897 -// ..onStart = _handleDragStart  
898 -// ..onUpdate = _handleDragUpdate  
899 -// ..onEnd = _handleDragEnd  
900 -// ..onCancel = _handleDragCancel;  
901 -// }  
902 -  
903 -// @override  
904 -// void dispose() {  
905 -// _recognizer.dispose();  
906 -// super.dispose();  
907 -// }  
908 -  
909 -// void _handleDragStart(DragStartDetails details) {  
910 -// assert(mounted);  
911 -// assert(_backGestureController == null);  
912 -// _backGestureController = widget.onStartPopGesture();  
913 -// }  
914 -  
915 -// void _handleDragUpdate(DragUpdateDetails details) {  
916 -// assert(mounted);  
917 -// assert(_backGestureController != null);  
918 -// _backGestureController.dragUpdate(  
919 -// _convertToLogical(details.primaryDelta / context.size.width));  
920 -// }  
921 -  
922 -// void _handleDragEnd(DragEndDetails details) {  
923 -// assert(mounted);  
924 -// assert(_backGestureController != null);  
925 -// _backGestureController.dragEnd(_convertToLogical(  
926 -// details.velocity.pixelsPerSecond.dx / context.size.width));  
927 -// _backGestureController = null;  
928 -// }  
929 -  
930 -// void _handleDragCancel() {  
931 -// assert(mounted);  
932 -// // This can be called even if start is not called, paired with the "down" event  
933 -// // that we don't consider here.  
934 -// _backGestureController?.dragEnd(0.0);  
935 -// _backGestureController = null;  
936 -// }  
937 -  
938 -// void _handlePointerDown(PointerDownEvent event) {  
939 -// if (widget.enabledCallback()) _recognizer.addPointer(event);  
940 -// }  
941 -  
942 -// double _convertToLogical(double value) {  
943 -// switch (Directionality.of(context)) {  
944 -// case TextDirection.rtl:  
945 -// return -value;  
946 -// case TextDirection.ltr:  
947 -// return value;  
948 -// }  
949 -// return null;  
950 -// }  
951 -  
952 -// @override  
953 -// Widget build(BuildContext context) {  
954 -// assert(debugCheckHasDirectionality(context));  
955 -// // For devices with notches, the drag area needs to be larger on the side  
956 -// // that has the notch.  
957 -// double dragAreaWidth = Directionality.of(context) == TextDirection.ltr  
958 -// ? MediaQuery.of(context).padding.left  
959 -// : MediaQuery.of(context).padding.right;  
960 -// dragAreaWidth = max(dragAreaWidth, _kBackGestureWidth);  
961 -// return Stack(  
962 -// fit: StackFit.passthrough,  
963 -// children: <Widget>[  
964 -// widget.child,  
965 -// PositionedDirectional(  
966 -// start: 0.0,  
967 -// width: dragAreaWidth,  
968 -// top: 0.0,  
969 -// bottom: 0.0,  
970 -// child: Listener(  
971 -// onPointerDown: _handlePointerDown,  
972 -// behavior: HitTestBehavior.translucent,  
973 -// ),  
974 -// ),  
975 -// ],  
976 -// );  
977 -// }  
978 -// }  
979 -  
980 -// class _CupertinoBackGestureController<T> {  
981 -// /// Creates a controller for an iOS-style back gesture.  
982 -// ///  
983 -// /// The [navigator] and [controller] arguments must not be null.  
984 -// _CupertinoBackGestureController({  
985 -// @required this.navigator,  
986 -// @required this.controller,  
987 -// }) : assert(navigator != null),  
988 -// assert(controller != null) {  
989 -// navigator.didStartUserGesture();  
990 -// }  
991 -  
992 -// final AnimationController controller;  
993 -// final NavigatorState navigator;  
994 -  
995 -// /// The drag gesture has changed by [fractionalDelta]. The total range of the  
996 -// /// drag should be 0.0 to 1.0.  
997 -// void dragUpdate(double delta) {  
998 -// controller.value -= delta;  
999 -// }  
1000 -  
1001 -// /// The drag gesture has ended with a horizontal motion of  
1002 -// /// [fractionalVelocity] as a fraction of screen width per second.  
1003 -// void dragEnd(double velocity) {  
1004 -// // Fling in the appropriate direction.  
1005 -// // AnimationController.fling is guaranteed to  
1006 -// // take at least one frame.  
1007 -// //  
1008 -// // This curve has been determined through rigorously eyeballing native iOS  
1009 -// // animations.  
1010 -// const Curve animationCurve = Curves.fastLinearToSlowEaseIn;  
1011 -// bool animateForward;  
1012 -  
1013 -// // If the user releases the page before mid screen with sufficient velocity,  
1014 -// // or after mid screen, we should animate the page out. Otherwise, the page  
1015 -// // should be animated back in.  
1016 -// if (velocity.abs() >= _kMinFlingVelocity)  
1017 -// animateForward = velocity <= 0;  
1018 -// else  
1019 -// animateForward = controller.value > 0.5;  
1020 -  
1021 -// if (animateForward) {  
1022 -// // The closer the panel is to dismissing, the shorter the animation is.  
1023 -// // We want to cap the animation time, but we want to use a linear curve  
1024 -// // to determine it.  
1025 -// final int droppedPageForwardAnimationTime = min(  
1026 -// lerpDouble(  
1027 -// _kMaxDroppedSwipePageForwardAnimationTime, 0, controller.value)  
1028 -// .floor(),  
1029 -// _kMaxPageBackAnimationTime,  
1030 -// );  
1031 -// controller.animateTo(1.0,  
1032 -// duration: Duration(milliseconds: droppedPageForwardAnimationTime),  
1033 -// curve: animationCurve);  
1034 -// } else {  
1035 -// // This route is destined to pop at this point. Reuse navigator's pop.  
1036 -// navigator.pop();  
1037 -  
1038 -// // The popping may have finished inline if already at the target destination.  
1039 -// if (controller.isAnimating) {  
1040 -// // Otherwise, use a custom popping animation duration and curve.  
1041 -// final int droppedPageBackAnimationTime = lerpDouble(  
1042 -// 0, _kMaxDroppedSwipePageForwardAnimationTime, controller.value)  
1043 -// .floor();  
1044 -// controller.animateBack(0.0,  
1045 -// duration: Duration(milliseconds: droppedPageBackAnimationTime),  
1046 -// curve: animationCurve);  
1047 -// }  
1048 -// }  
1049 -  
1050 -// if (controller.isAnimating) {  
1051 -// // Keep the userGestureInProgress in true state so we don't change the  
1052 -// // curve of the page transition mid-flight since CupertinoPageTransition  
1053 -// // depends on userGestureInProgress.  
1054 -// AnimationStatusListener animationStatusCallback;  
1055 -// animationStatusCallback = (AnimationStatus status) {  
1056 -// navigator.didStopUserGesture();  
1057 -// controller.removeStatusListener(animationStatusCallback);  
1058 -// };  
1059 -// controller.addStatusListener(animationStatusCallback);  
1060 -// } else {  
1061 -// navigator.didStopUserGesture();  
1062 -// }  
1063 -// }  
1064 -// }  
1 import 'package:flutter/cupertino.dart'; 1 import 'package:flutter/cupertino.dart';
2 import 'package:flutter/material.dart'; 2 import 'package:flutter/material.dart';
3 -import 'transitions_component.dart';  
4 3
5 -class LeftToRightFadeTransition extends TransitionComponent {  
6 - @override  
7 - Widget buildChildWithTransition( 4 +class LeftToRightFadeTransition {
  5 + Widget buildTransitions(
8 BuildContext context, 6 BuildContext context,
9 Curve curve, 7 Curve curve,
10 Alignment alignment, 8 Alignment alignment,
@@ -29,9 +27,8 @@ class LeftToRightFadeTransition extends TransitionComponent { @@ -29,9 +27,8 @@ class LeftToRightFadeTransition extends TransitionComponent {
29 } 27 }
30 } 28 }
31 29
32 -class RightToLeftFadeTransition extends TransitionComponent {  
33 - @override  
34 - Widget buildChildWithTransition( 30 +class RightToLeftFadeTransition {
  31 + Widget buildTransitions(
35 BuildContext context, 32 BuildContext context,
36 Curve curve, 33 Curve curve,
37 Alignment alignment, 34 Alignment alignment,
@@ -56,9 +53,8 @@ class RightToLeftFadeTransition extends TransitionComponent { @@ -56,9 +53,8 @@ class RightToLeftFadeTransition extends TransitionComponent {
56 } 53 }
57 } 54 }
58 55
59 -class NoTransition extends TransitionComponent {  
60 - @override  
61 - Widget buildChildWithTransition( 56 +class NoTransition {
  57 + Widget buildTransitions(
62 BuildContext context, 58 BuildContext context,
63 Curve curve, 59 Curve curve,
64 Alignment alignment, 60 Alignment alignment,
@@ -69,9 +65,8 @@ class NoTransition extends TransitionComponent { @@ -69,9 +65,8 @@ class NoTransition extends TransitionComponent {
69 } 65 }
70 } 66 }
71 67
72 -class FadeInTransition extends TransitionComponent {  
73 - @override  
74 - Widget buildChildWithTransition( 68 +class FadeInTransition {
  69 + Widget buildTransitions(
75 BuildContext context, 70 BuildContext context,
76 Curve curve, 71 Curve curve,
77 Alignment alignment, 72 Alignment alignment,
@@ -82,9 +77,8 @@ class FadeInTransition extends TransitionComponent { @@ -82,9 +77,8 @@ class FadeInTransition extends TransitionComponent {
82 } 77 }
83 } 78 }
84 79
85 -class SlideDownTransition extends TransitionComponent {  
86 - @override  
87 - Widget buildChildWithTransition( 80 +class SlideDownTransition {
  81 + Widget buildTransitions(
88 BuildContext context, 82 BuildContext context,
89 Curve curve, 83 Curve curve,
90 Alignment alignment, 84 Alignment alignment,
@@ -101,9 +95,8 @@ class SlideDownTransition extends TransitionComponent { @@ -101,9 +95,8 @@ class SlideDownTransition extends TransitionComponent {
101 } 95 }
102 } 96 }
103 97
104 -class SlideLeftTransition extends TransitionComponent {  
105 - @override  
106 - Widget buildChildWithTransition( 98 +class SlideLeftTransition {
  99 + Widget buildTransitions(
107 BuildContext context, 100 BuildContext context,
108 Curve curve, 101 Curve curve,
109 Alignment alignment, 102 Alignment alignment,
@@ -120,9 +113,8 @@ class SlideLeftTransition extends TransitionComponent { @@ -120,9 +113,8 @@ class SlideLeftTransition extends TransitionComponent {
120 } 113 }
121 } 114 }
122 115
123 -class SlideRightTransition extends TransitionComponent {  
124 - @override  
125 - Widget buildChildWithTransition( 116 +class SlideRightTransition {
  117 + Widget buildTransitions(
126 BuildContext context, 118 BuildContext context,
127 Curve curve, 119 Curve curve,
128 Alignment alignment, 120 Alignment alignment,
@@ -139,9 +131,8 @@ class SlideRightTransition extends TransitionComponent { @@ -139,9 +131,8 @@ class SlideRightTransition extends TransitionComponent {
139 } 131 }
140 } 132 }
141 133
142 -class SlideTopTransition extends TransitionComponent {  
143 - @override  
144 - Widget buildChildWithTransition( 134 +class SlideTopTransition {
  135 + Widget buildTransitions(
145 BuildContext context, 136 BuildContext context,
146 Curve curve, 137 Curve curve,
147 Alignment alignment, 138 Alignment alignment,
@@ -158,9 +149,8 @@ class SlideTopTransition extends TransitionComponent { @@ -158,9 +149,8 @@ class SlideTopTransition extends TransitionComponent {
158 } 149 }
159 } 150 }
160 151
161 -class ZoomInTransition extends TransitionComponent {  
162 - @override  
163 - Widget buildChildWithTransition( 152 +class ZoomInTransition {
  153 + Widget buildTransitions(
164 BuildContext context, 154 BuildContext context,
165 Curve curve, 155 Curve curve,
166 Alignment alignment, 156 Alignment alignment,
@@ -174,9 +164,8 @@ class ZoomInTransition extends TransitionComponent { @@ -174,9 +164,8 @@ class ZoomInTransition extends TransitionComponent {
174 } 164 }
175 } 165 }
176 166
177 -class SizeTransitions extends TransitionComponent {  
178 - @override  
179 - Widget buildChildWithTransition( 167 +class SizeTransitions {
  168 + Widget buildTransitions(
180 BuildContext context, 169 BuildContext context,
181 Curve curve, 170 Curve curve,
182 Alignment alignment, 171 Alignment alignment,
@@ -196,9 +185,8 @@ class SizeTransitions extends TransitionComponent { @@ -196,9 +185,8 @@ class SizeTransitions extends TransitionComponent {
196 } 185 }
197 } 186 }
198 187
199 -class CupertinoTransitions extends TransitionComponent {  
200 - @override  
201 - Widget buildChildWithTransition( 188 +class CupertinoTransitions {
  189 + Widget buildTransitions(
202 BuildContext context, 190 BuildContext context,
203 Curve curve, 191 Curve curve,
204 Alignment alignment, 192 Alignment alignment,
@@ -10,6 +10,7 @@ enum Transition { @@ -10,6 +10,7 @@ enum Transition {
10 rightToLeftWithFade, 10 rightToLeftWithFade,
11 leftToRightWithFade, 11 leftToRightWithFade,
12 zoom, 12 zoom,
  13 + topLevel,
13 noTransition, 14 noTransition,
14 cupertino, 15 cupertino,
15 cupertinoDialog, 16 cupertinoDialog,
@@ -100,6 +100,16 @@ class GetImplXState<T extends DisposableInterface> extends State<GetX<T>> { @@ -100,6 +100,16 @@ class GetImplXState<T extends DisposableInterface> extends State<GetX<T>> {
100 final observer = getObs; 100 final observer = getObs;
101 getObs = _observer; 101 getObs = _observer;
102 final result = widget.builder(controller); 102 final result = widget.builder(controller);
  103 + if (!_observer.canUpdate) {
  104 + throw """
  105 + [Get] the improper use of a GetX has been detected.
  106 + You should only use GetX or Obx for the specific widget that will be updated.
  107 + If you are seeing this error, you probably did not insert any observable variables into GetX/Obx
  108 + or insert them outside the scope that GetX considers suitable for an update
  109 + (example: GetX => HeavyWidget => variableObservable).
  110 + If you need to update a parent widget and a child widget, wrap each one in an Obx/GetX.
  111 + """;
  112 + }
103 getObs = observer; 113 getObs = observer;
104 return result; 114 return result;
105 } 115 }
@@ -15,6 +15,10 @@ class _RxImpl<T> implements RxInterface<T> { @@ -15,6 +15,10 @@ class _RxImpl<T> implements RxInterface<T> {
15 return _value; 15 return _value;
16 } 16 }
17 17
  18 + bool get canUpdate {
  19 + return _subscriptions.length > 0;
  20 + }
  21 +
18 T call([T v]) { 22 T call([T v]) {
19 if (v != null) { 23 if (v != null) {
20 this.value = v; 24 this.value = v;
@@ -84,6 +88,10 @@ class RxMap<K, V> extends RxInterface implements Map<K, V> { @@ -84,6 +88,10 @@ class RxMap<K, V> extends RxInterface implements Map<K, V> {
84 88
85 String get string => value.toString(); 89 String get string => value.toString();
86 90
  91 + bool get canUpdate {
  92 + return _subscriptions.length > 0;
  93 + }
  94 +
87 @override 95 @override
88 void close() { 96 void close() {
89 _subscriptions.forEach((observable, subscription) { 97 _subscriptions.forEach((observable, subscription) {
@@ -250,6 +258,10 @@ class RxList<E> extends Iterable<E> implements RxInterface<E> { @@ -250,6 +258,10 @@ class RxList<E> extends Iterable<E> implements RxInterface<E> {
250 @override 258 @override
251 bool get isEmpty => value.isEmpty; 259 bool get isEmpty => value.isEmpty;
252 260
  261 + bool get canUpdate {
  262 + return _subscriptions.length > 0;
  263 + }
  264 +
253 @override 265 @override
254 bool get isNotEmpty => value.isNotEmpty; 266 bool get isNotEmpty => value.isNotEmpty;
255 267
@@ -419,8 +431,6 @@ RxInterface getObs; @@ -419,8 +431,6 @@ RxInterface getObs;
419 431
420 typedef bool Condition(); 432 typedef bool Condition();
421 433
422 -typedef E ChildrenListComposer<S, E>(S value);  
423 -  
424 class RxBool extends _RxImpl<bool> { 434 class RxBool extends _RxImpl<bool> {
425 RxBool([bool initial]) { 435 RxBool([bool initial]) {
426 _value = initial; 436 _value = initial;
@@ -8,6 +8,8 @@ abstract class RxInterface<T> { @@ -8,6 +8,8 @@ abstract class RxInterface<T> {
8 /// add listener to stream 8 /// add listener to stream
9 addListener(Stream<T> rxGetx); 9 addListener(Stream<T> rxGetx);
10 10
  11 + bool get canUpdate;
  12 +
11 /// close stream 13 /// close stream
12 close() { 14 close() {
13 subject?.close(); 15 subject?.close();
@@ -15,14 +17,8 @@ abstract class RxInterface<T> { @@ -15,14 +17,8 @@ abstract class RxInterface<T> {
15 17
16 StreamController<T> subject; 18 StreamController<T> subject;
17 19
18 - /// Convert value on string  
19 - // String get string;  
20 -  
21 /// Calls [callback] with current value, when the value changes. 20 /// Calls [callback] with current value, when the value changes.
22 StreamSubscription<T> listen(ValueCallback<T> callback); 21 StreamSubscription<T> listen(ValueCallback<T> callback);
23 -  
24 - /// Maps the changes into a [Stream] of [S]  
25 - // Stream<S> map<S>(S mapper(T data));  
26 } 22 }
27 23
28 abstract class DisposableInterface { 24 abstract class DisposableInterface {
@@ -54,6 +54,16 @@ class _ObxState extends State<Obx> { @@ -54,6 +54,16 @@ class _ObxState extends State<Obx> {
54 final observer = getObs; 54 final observer = getObs;
55 getObs = _observer; 55 getObs = _observer;
56 final result = widget.builder(); 56 final result = widget.builder();
  57 + if (!_observer.canUpdate) {
  58 + throw """
  59 + [Get] the improper use of a GetX has been detected.
  60 + You should only use GetX or Obx for the specific widget that will be updated.
  61 + If you are seeing this error, you probably did not insert any observable variables into GetX/Obx
  62 + or insert them outside the scope that GetX considers suitable for an update
  63 + (example: GetX => HeavyWidget => variableObservable).
  64 + If you need to update a parent widget and a child widget, wrap each one in an Obx/GetX.
  65 + """;
  66 + }
57 getObs = observer; 67 getObs = observer;
58 return result; 68 return result;
59 } 69 }
1 name: get 1 name: get
2 description: Open screens/snackbars/dialogs/bottomSheets without context, manage states and inject dependencies easily with Get. 2 description: Open screens/snackbars/dialogs/bottomSheets without context, manage states and inject dependencies easily with Get.
3 -version: 3.2.1 3 +version: 3.2.2
4 homepage: https://github.com/jonataslaw/get 4 homepage: https://github.com/jonataslaw/get
5 5
6 environment: 6 environment: