Jonny Borges
Committed by GitHub

update to 3.2.1

## [3.2.1]
- Prevent black blackground on cupertino fullscreenDialog
## [3.2.0]
- Improve GetBuilder ram usage
- Added method update to Rx
... ...

111 KB | W: | H:

125 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin
library get;
export 'src/routes/default_route.dart';
export 'src/get_main.dart';
export 'src/snackbar/snack.dart';
export 'src/bottomsheet/bottomsheet.dart';
export 'src/snackbar/snack_route.dart';
export 'src/state/get_state.dart';
export 'src/state/get_view.dart';
export 'src/regex/get_utils.dart';
export 'src/queue/get_queue.dart';
export 'src/state/mixin_state.dart';
export 'src/rx/rx_interface.dart';
export 'src/rx/rx_impl.dart';
export 'src/rx/rx_event.dart';
export 'src/rx/rx_obx.dart';
export 'src/rx/rx_getbuilder.dart';
export 'src/root/root_widget.dart';
export 'src/root/smart_management.dart';
export 'src/routes/default_route.dart';
export 'src/routes/get_route.dart';
export 'src/routes/bindings_interface.dart';
export 'src/routes/observers/route_observer.dart';
export 'src/routes/transitions_type.dart';
export 'src/platform/platform.dart';
export 'src/instance/extension_instance.dart';
export 'src/instance/get_instance.dart';
export 'src/typedefs/typedefs.dart';
export 'src/routes/custom_transition.dart';
export 'src/context_extensions/extensions.dart';
export 'instance_manager.dart';
export 'route_manager.dart';
export 'state_manager.dart';
export 'utils.dart';
... ...
export 'src/instance/get_instance.dart';
export 'src/instance/extension_instance.dart';
export 'src/typedefs/typedefs.dart';
export 'src/routes/bindings_interface.dart';
... ...
export 'src/routes/custom_transition.dart';
export 'src/routes/transitions_type.dart';
export 'src/routes/get_route.dart';
export 'src/routes/default_route.dart';
export 'src/routes/observers/route_observer.dart';
export 'src/root/root_widget.dart';
export 'src/snackbar/snack_route.dart';
export 'src/bottomsheet/bottomsheet.dart';
export 'src/snackbar/snack.dart';
export 'src/get_main.dart';
export 'src/routes/default_route.dart';
export 'src/root/smart_management.dart';
... ...
... ... @@ -27,6 +27,7 @@ class GetImpl implements GetService {
Duration defaultDurationTransition = Duration(milliseconds: 400);
bool defaultGlobalState = true;
RouteSettings settings;
String defaultSeparator = "_";
///Use to instead of Navigator.push, off instead of Navigator.pushReplacement,
///offAll instead of Navigator.pushAndRemoveUntil. For named routes just add "named"
... ...
import 'dart:collection';
import 'package:flutter/widgets.dart';
import 'package:get/src/routes/get_route.dart';
... ... @@ -22,7 +20,7 @@ class ParseRouteTree {
// throw ("Default route was already defined");
// }
var node = ParseRouteTreeNode(path, ParseRouteTreeNodeType.component);
node.routes = HashSet<GetPage>()..add(route);
node.routes = [route];
_nodes.add(node);
// _hasDefaultRoute = true;
return;
... ... @@ -47,7 +45,7 @@ class ParseRouteTree {
}
if (i == pathComponents.length - 1) {
if (node.routes == null) {
node.routes = HashSet<GetPage>()..add(route);
node.routes = [route];
} else {
node.routes.add(route);
}
... ... @@ -133,8 +131,8 @@ class ParseRouteTree {
if (nodeToUse != null &&
nodeToUse.routes != null &&
nodeToUse.routes.length > 0) {
HashSet<GetPage> routes = nodeToUse.routes;
GetPageMatch routeMatch = GetPageMatch(routes.first);
List<GetPage> routes = nodeToUse.routes;
GetPageMatch routeMatch = GetPageMatch(routes[0]);
routeMatch.parameters = match.parameters;
... ... @@ -203,7 +201,7 @@ class ParseRouteTreeNode {
String part;
ParseRouteTreeNodeType type;
HashSet<GetPage> routes = HashSet<GetPage>();
List<GetPage> routes = <GetPage>[];
List<ParseRouteTreeNode> nodes = <ParseRouteTreeNode>[];
ParseRouteTreeNode parent;
... ...
import 'dart:math';
import 'dart:ui' show lerpDouble;
import 'package:flutter/cupertino.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:get/src/get_main.dart';
... ... @@ -27,7 +28,7 @@ class GetPageRoute<T> extends PageRouteBuilder<T> {
// this.transitionComponent,
RouteSettings settings,
this.duration,
this.transition = Transition.native,
this.transition,
this.binding,
@required this.page,
this.bindings,
... ... @@ -60,9 +61,33 @@ class GetPageRoute<T> extends PageRouteBuilder<T> {
@override
final bool fullscreenDialog;
static bool isPopGestureInProgress(PageRoute<dynamic> route) {
return route.navigator.userGestureInProgress;
}
bool get popGestureInProgress => isPopGestureInProgress(this);
@override
bool canTransitionTo(TransitionRoute<dynamic> nextRoute) {
// Don't perform outgoing animation if the next route is a fullscreen dialog.
return nextRoute is GetPageRoute && !nextRoute.fullscreenDialog;
}
@override
Widget buildTransitions(BuildContext context, Animation<double> animation,
Animation<double> secondaryAnimation, Widget child) {
if (fullscreenDialog != null &&
transition == null &&
customTransition == null) {
final bool linearTransition = isPopGestureInProgress(this);
return CupertinoFullscreenDialogTransition(
primaryRouteAnimation: animation,
secondaryRouteAnimation: secondaryAnimation,
child: child,
linearTransition: linearTransition,
);
}
if (this.customTransition != null) {
return this.customTransition.buildTransition(
context,
... ... @@ -174,12 +199,6 @@ class GetPageRoute<T> extends PageRouteBuilder<T> {
controller: route.controller,
);
}
static bool isPopGestureInProgress(PageRoute<dynamic> route) {
return route.navigator.userGestureInProgress;
}
bool get popGestureInProgress => isPopGestureInProgress(this);
}
const double _kBackGestureWidth = 20.0;
... ...
... ... @@ -2,11 +2,7 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'transitions_component.dart';
class LeftToRightFadeTransition extends TransitionInterface {
LeftToRightFadeTransition({
TransitionComponent transitionComponent,
}) : super(transitionComponent: transitionComponent);
class LeftToRightFadeTransition extends TransitionComponent {
@override
Widget buildChildWithTransition(
BuildContext context,
... ... @@ -33,11 +29,7 @@ class LeftToRightFadeTransition extends TransitionInterface {
}
}
class RightToLeftFadeTransition extends TransitionInterface {
RightToLeftFadeTransition({
TransitionComponent transitionComponent,
}) : super(transitionComponent: transitionComponent);
class RightToLeftFadeTransition extends TransitionComponent {
@override
Widget buildChildWithTransition(
BuildContext context,
... ... @@ -64,11 +56,7 @@ class RightToLeftFadeTransition extends TransitionInterface {
}
}
class NoTransition extends TransitionInterface {
NoTransition({
TransitionComponent transitionComponent,
}) : super(transitionComponent: transitionComponent);
class NoTransition extends TransitionComponent {
@override
Widget buildChildWithTransition(
BuildContext context,
... ... @@ -77,16 +65,11 @@ class NoTransition extends TransitionInterface {
Animation<double> animation,
Animation<double> secondaryAnimation,
Widget child) {
return transitionComponent.buildChildWithTransition(
context, curve, alignment, animation, secondaryAnimation, child);
return child;
}
}
class FadeInTransition extends TransitionInterface {
FadeInTransition({
TransitionComponent transitionComponent,
}) : super(transitionComponent: transitionComponent);
class FadeInTransition extends TransitionComponent {
@override
Widget buildChildWithTransition(
BuildContext context,
... ... @@ -95,19 +78,11 @@ class FadeInTransition extends TransitionInterface {
Animation<double> animation,
Animation<double> secondaryAnimation,
Widget child) {
return FadeTransition(
opacity: animation,
child: transitionComponent.buildChildWithTransition(
context, curve, alignment, animation, secondaryAnimation, child),
);
return FadeTransition(opacity: animation, child: child);
}
}
class SlideDownTransition extends TransitionInterface {
SlideDownTransition({
TransitionComponent transitionComponent,
}) : super(transitionComponent: transitionComponent);
class SlideDownTransition extends TransitionComponent {
@override
Widget buildChildWithTransition(
BuildContext context,
... ... @@ -121,17 +96,12 @@ class SlideDownTransition extends TransitionInterface {
begin: Offset(0.0, 1.0),
end: Offset.zero,
).animate(animation),
child: transitionComponent.buildChildWithTransition(
context, curve, alignment, animation, secondaryAnimation, child),
child: child,
);
}
}
class SlideLeftTransition extends TransitionInterface {
SlideLeftTransition({
TransitionComponent transitionComponent,
}) : super(transitionComponent: transitionComponent);
class SlideLeftTransition extends TransitionComponent {
@override
Widget buildChildWithTransition(
BuildContext context,
... ... @@ -145,17 +115,12 @@ class SlideLeftTransition extends TransitionInterface {
begin: Offset(-1.0, 0.0),
end: Offset.zero,
).animate(animation),
child: transitionComponent.buildChildWithTransition(
context, curve, alignment, animation, secondaryAnimation, child),
child: child,
);
}
}
class SlideRightTransition extends TransitionInterface {
SlideRightTransition({
TransitionComponent transitionComponent,
}) : super(transitionComponent: transitionComponent);
class SlideRightTransition extends TransitionComponent {
@override
Widget buildChildWithTransition(
BuildContext context,
... ... @@ -169,17 +134,12 @@ class SlideRightTransition extends TransitionInterface {
begin: Offset(1.0, 0.0),
end: Offset.zero,
).animate(animation),
child: transitionComponent.buildChildWithTransition(
context, curve, alignment, animation, secondaryAnimation, child),
child: child,
);
}
}
class SlideTopTransition extends TransitionInterface {
SlideTopTransition({
TransitionComponent transitionComponent,
}) : super(transitionComponent: transitionComponent);
class SlideTopTransition extends TransitionComponent {
@override
Widget buildChildWithTransition(
BuildContext context,
... ... @@ -193,17 +153,12 @@ class SlideTopTransition extends TransitionInterface {
begin: Offset(0.0, -1.0),
end: Offset.zero,
).animate(animation),
child: transitionComponent.buildChildWithTransition(
context, curve, alignment, animation, secondaryAnimation, child),
child: child,
);
}
}
class ZoomInTransition extends TransitionInterface {
ZoomInTransition({
TransitionComponent transitionComponent,
}) : super(transitionComponent: transitionComponent);
class ZoomInTransition extends TransitionComponent {
@override
Widget buildChildWithTransition(
BuildContext context,
... ... @@ -214,17 +169,12 @@ class ZoomInTransition extends TransitionInterface {
Widget child) {
return ScaleTransition(
scale: animation,
child: transitionComponent.buildChildWithTransition(
context, curve, alignment, animation, secondaryAnimation, child),
child: child,
);
}
}
class SizeTransitions extends TransitionInterface {
SizeTransitions({
TransitionComponent transitionComponent,
}) : super(transitionComponent: transitionComponent);
class SizeTransitions extends TransitionComponent {
@override
Widget buildChildWithTransition(
BuildContext context,
... ... @@ -246,11 +196,7 @@ class SizeTransitions extends TransitionInterface {
}
}
class CupertinoTransitions extends TransitionInterface {
CupertinoTransitions({
TransitionComponent transitionComponent,
}) : super(transitionComponent: transitionComponent);
class CupertinoTransitions extends TransitionComponent {
@override
Widget buildChildWithTransition(
BuildContext context,
... ... @@ -267,8 +213,3 @@ class CupertinoTransitions extends TransitionInterface {
);
}
}
abstract class TransitionInterface implements TransitionComponent {
TransitionComponent transitionComponent;
TransitionInterface({this.transitionComponent});
}
... ...
... ... @@ -6,42 +6,39 @@ class TransitionFilter {
static TransitionComponent newTransitionComponent(
Transition transition,
) {
TransitionComponent transitionComponent = TransitionComponent();
switch (transition) {
case Transition.leftToRight:
return SlideLeftTransition(transitionComponent: transitionComponent);
return SlideLeftTransition();
case Transition.downToUp:
return SlideDownTransition(transitionComponent: transitionComponent);
return SlideDownTransition();
case Transition.upToDown:
return SlideTopTransition(transitionComponent: transitionComponent);
return SlideTopTransition();
case Transition.rightToLeft:
return SlideRightTransition(transitionComponent: transitionComponent);
return SlideRightTransition();
case Transition.zoom:
return ZoomInTransition(transitionComponent: transitionComponent);
return ZoomInTransition();
case Transition.fadeIn:
return FadeInTransition(transitionComponent: transitionComponent);
return FadeInTransition();
case Transition.rightToLeftWithFade:
return RightToLeftFadeTransition(
transitionComponent: transitionComponent);
return RightToLeftFadeTransition();
case Transition.leftToRightWithFade:
return LeftToRightFadeTransition(
transitionComponent: transitionComponent);
return LeftToRightFadeTransition();
case Transition.cupertino:
return CupertinoTransitions(transitionComponent: transitionComponent);
return CupertinoTransitions();
case Transition.size:
return SizeTransitions(transitionComponent: transitionComponent);
return SizeTransitions();
default:
return FadeInTransition(transitionComponent: transitionComponent);
return FadeInTransition();
}
}
}
... ...
... ... @@ -12,6 +12,7 @@ enum Transition {
zoom,
noTransition,
cupertino,
cupertinoDialog,
size,
native
}
... ...
... ... @@ -3,7 +3,7 @@ import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:get/get.dart';
import 'snack_route.dart' as snackroute;
import 'snack_route.dart' as route;
typedef void SnackStatusCallback(SnackStatus status);
typedef void OnTap(GetBar snack);
... ... @@ -209,11 +209,11 @@ class GetBar<T extends Object> extends StatefulWidget {
/// A [TextFormField] in case you want a simple user input. Every other widget is ignored if this is not null.
final Form userInputForm;
snackroute.SnackRoute<T> _snackRoute;
route.SnackRoute<T> _snackRoute;
/// Show the snack. Kicks in [SnackStatus.IS_APPEARING] state followed by [SnackStatus.SHOWING]
Future<T> show() async {
_snackRoute = snackroute.showSnack<T>(
_snackRoute = route.showSnack<T>(
snack: this,
) as SnackRoute<T>;
return await Get.key.currentState.push(_snackRoute);
... ... @@ -374,19 +374,18 @@ class _GetBarState<K extends Object> extends State<GetBar>
: widget.backgroundColor,
child: SafeArea(
minimum: widget.snackPosition == SnackPosition.BOTTOM
? EdgeInsets.only(bottom: MediaQuery.of(context).padding.bottom)
? EdgeInsets.only(
bottom: (GetUtils.isGreaterThan(
MediaQuery.of(context).viewInsets.bottom,
MediaQuery.of(context).padding.bottom)
? MediaQuery.of(context).viewInsets.bottom
: MediaQuery.of(context).padding.bottom))
: EdgeInsets.only(top: MediaQuery.of(context).padding.top),
child: SafeArea(
minimum: widget.snackPosition == SnackPosition.BOTTOM
? EdgeInsets.only(
bottom: MediaQuery.of(context).viewInsets.bottom)
: EdgeInsets.only(top: MediaQuery.of(context).viewInsets.top),
bottom: widget.snackPosition == SnackPosition.BOTTOM,
top: widget.snackPosition == SnackPosition.TOP,
left: false,
right: false,
child: _getSnack(),
),
bottom: widget.snackPosition == SnackPosition.BOTTOM,
top: widget.snackPosition == SnackPosition.TOP,
left: false,
right: false,
child: _getSnack(),
),
),
);
... ...
import 'dart:async';
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:get/src/snackbar/snack.dart';
import 'package:flutter/widgets.dart';
import 'snack.dart';
class SnackRoute<T> extends OverlayRoute<T> {
final GetBar snack;
final Builder _builder;
final Completer<T> _transitionCompleter = Completer<T>();
final SnackStatusCallback _onStatusChanged;
Alignment _initialAlignment;
Alignment _endAlignment;
bool _wasDismissedBySwipe = false;
Timer _timer;
T _result;
SnackStatus currentStatus;
Animation<double> _filterBlurAnimation;
Animation<Color> _filterColorAnimation;
SnackRoute({
@required this.snack,
RouteSettings settings,
}) : _builder = Builder(builder: (BuildContext innerContext) {
return GestureDetector(
child: snack,
onTap: snack.onTap != null ? () => snack.onTap(snack) : null,
);
}),
_onStatusChanged = snack.onStatusChanged,
super(settings: settings) {
}) : super(settings: settings) {
this._builder = Builder(builder: (BuildContext innerContext) {
return GestureDetector(
child: snack,
onTap: snack.onTap != null ? () => snack.onTap(snack) : null,
);
});
_configureAlignment(this.snack.snackPosition);
_onStatusChanged = snack.onStatusChanged;
}
void _configureAlignment(SnackPosition snackPosition) {
_configureAlignment(SnackPosition snackPosition) {
switch (snack.snackPosition) {
case SnackPosition.TOP:
{
... ... @@ -46,12 +39,51 @@ class SnackRoute<T> extends OverlayRoute<T> {
}
}
GetBar snack;
Builder _builder;
Future<T> get completed => _transitionCompleter.future;
final Completer<T> _transitionCompleter = Completer<T>();
SnackStatusCallback _onStatusChanged;
Alignment _initialAlignment;
Alignment _endAlignment;
bool _wasDismissedBySwipe = false;
Timer _timer;
bool get opaque => false;
@override
Iterable<OverlayEntry> createOverlayEntries() {
final List<OverlayEntry> overlays = [];
List<OverlayEntry> overlays = [];
if (snack.overlayBlur > 0.0) {
overlays.add(
OverlayEntry(
builder: (BuildContext context) {
return GestureDetector(
onTap: snack.isDismissible ? () => snack.dismiss() : null,
child: AnimatedBuilder(
animation: _filterBlurAnimation,
builder: (context, child) {
return BackdropFilter(
filter: ImageFilter.blur(
sigmaX: _filterBlurAnimation.value,
sigmaY: _filterBlurAnimation.value),
child: Container(
constraints: BoxConstraints.expand(),
color: _filterColorAnimation.value,
),
);
},
),
);
},
maintainState: false,
opaque: opaque),
);
}
overlays.add(
OverlayEntry(
... ... @@ -59,7 +91,9 @@ class SnackRoute<T> extends OverlayRoute<T> {
final Widget annotatedChild = Semantics(
child: AlignTransition(
alignment: _animation,
child: _getSnack(),
child: snack.isDismissible
? _getDismissibleSnack(_builder)
: _getSnack(),
),
focused: false,
container: true,
... ... @@ -74,9 +108,35 @@ class SnackRoute<T> extends OverlayRoute<T> {
return overlays;
}
/// This string is a workaround until Dismissible supports a returning item
String dismissibleKeyGen = "";
Widget _getDismissibleSnack(Widget child) {
return Dismissible(
direction: _getDismissDirection(),
resizeDuration: null,
confirmDismiss: (_) {
if (currentStatus == SnackStatus.IS_APPEARING ||
currentStatus == SnackStatus.IS_HIDING) {
return Future.value(false);
}
return Future.value(true);
},
key: Key(dismissibleKeyGen),
onDismissed: (_) {
dismissibleKeyGen += "1";
_cancelTimer();
_wasDismissedBySwipe = true;
if (isCurrent) {
navigator.pop();
} else {
navigator.removeRoute(this);
}
},
child: _getSnack(),
);
}
Widget _getSnack() {
return Container(
margin: snack.margin,
... ... @@ -84,6 +144,18 @@ class SnackRoute<T> extends OverlayRoute<T> {
);
}
DismissDirection _getDismissDirection() {
if (snack.dismissDirection == SnackDismissDirection.HORIZONTAL) {
return DismissDirection.horizontal;
} else {
if (snack.snackPosition == SnackPosition.TOP) {
return DismissDirection.up;
} else {
return DismissDirection.down;
}
}
}
@override
bool get finishedWhenPopped =>
_controller.status == AnimationStatus.dismissed;
... ... @@ -132,8 +204,6 @@ class SnackRoute<T> extends OverlayRoute<T> {
}
Animation<double> createBlurFilterAnimation() {
if (snack.overlayBlur == null) return null;
return Tween(begin: 0.0, end: snack.overlayBlur).animate(
CurvedAnimation(
parent: _controller,
... ... @@ -147,9 +217,7 @@ class SnackRoute<T> extends OverlayRoute<T> {
}
Animation<Color> createColorFilterAnimation() {
if (snack.overlayColor == null) return null;
return ColorTween(begin: Colors.transparent, end: snack.overlayColor)
return ColorTween(begin: Color(0x00000000), end: snack.overlayColor)
.animate(
CurvedAnimation(
parent: _controller,
... ... @@ -162,6 +230,9 @@ class SnackRoute<T> extends OverlayRoute<T> {
);
}
T _result;
SnackStatus currentStatus;
//copy of `routes.dart`
void _handleStatusChanged(AnimationStatus status) {
switch (status) {
... ... @@ -205,6 +276,8 @@ class SnackRoute<T> extends OverlayRoute<T> {
_controller = createAnimationController();
assert(_controller != null,
'$runtimeType.createAnimationController() returned null.');
_filterBlurAnimation = createBlurFilterAnimation();
_filterColorAnimation = createColorFilterAnimation();
_animation = createAnimation();
assert(_animation != null, '$runtimeType.createAnimation() returned null.');
super.install();
... ... @@ -212,17 +285,28 @@ class SnackRoute<T> extends OverlayRoute<T> {
@override
TickerFuture didPush() {
super.didPush();
assert(_controller != null,
'$runtimeType.didPush called before calling install() or after calling dispose().');
assert(!_transitionCompleter.isCompleted,
'Cannot reuse a $runtimeType after disposing it.');
_animation.addStatusListener(_handleStatusChanged);
_configureTimer();
super.didPush();
return _controller.forward();
}
@override
void didReplace(Route<dynamic> oldRoute) {
assert(_controller != null,
'$runtimeType.didReplace called before calling install() or after calling dispose().');
assert(!_transitionCompleter.isCompleted,
'Cannot reuse a $runtimeType after disposing it.');
if (oldRoute is SnackRoute) _controller.value = oldRoute._controller.value;
_animation.addStatusListener(_handleStatusChanged);
super.didReplace(oldRoute);
}
@override
bool didPop(T result) {
assert(_controller != null,
'$runtimeType.didPop called before calling install() or after calling dispose().');
... ... @@ -270,6 +354,17 @@ class SnackRoute<T> extends OverlayRoute<T> {
}
}
/// Whether this route can perform a transition to the given route.
/// Subclasses can override this method to restrict the set of routes they
/// need to coordinate transitions with.
bool canTransitionTo(SnackRoute<dynamic> nextRoute) => true;
/// Whether this route can perform a transition from the given route.
///
/// Subclasses can override this method to restrict the set of routes they
/// need to coordinate transitions with.
bool canTransitionFrom(SnackRoute<dynamic> previousRoute) => true;
@override
void dispose() {
assert(!_transitionCompleter.isCompleted,
... ... @@ -287,8 +382,10 @@ class SnackRoute<T> extends OverlayRoute<T> {
}
SnackRoute showSnack<T>({@required GetBar snack}) {
assert(snack != null);
return SnackRoute<T>(
snack: snack,
settings: RouteSettings(name: 'snackbar'),
settings: RouteSettings(name: "snackbar"),
);
}
... ...
export 'src/state/get_state.dart';
export 'src/state/get_view.dart';
export 'src/state/mixin_state.dart';
export 'src/rx/rx_interface.dart';
export 'src/rx/rx_impl.dart';
export 'src/rx/rx_event.dart';
export 'src/rx/rx_obx.dart';
export 'src/rx/rx_getbuilder.dart';
... ...
export 'src/context_extensions/extensions.dart';
export 'src/queue/get_queue.dart';
export 'src/platform/platform.dart';
export 'src/regex/get_utils.dart';
... ...
name: get
description: Open screens/snackbars/dialogs/bottomSheets without context, manage states and inject dependencies easily with Get.
version: 3.2.0
version: 3.2.1
homepage: https://github.com/jonataslaw/get
environment:
... ...