import 'package:flutter/material.dart'; enum TransitionType { ///左侧弹出 inFromLeft, ///右侧弹出 inFromRight, ///顶部弹出 inFromTop, ///底部弹出 inFromBottom, ///缩放 scale, ///渐变 fade, ///旋转缩放 rotation, ///放大 size, } //弹出动画 // barrierDismissible:点击背景是否消失 // child,builder:子 widget // useRootNavigator: 是否推入传入 context的 导航器 // routeSettings: 弹窗路由设置 Future showAnimationDialog({ required BuildContext context, bool barrierDismissible = true, Widget? child, WidgetBuilder? builder, bool useRootNavigator = true, RouteSettings? routeSettings, TransitionType? transitionType, }) { assert(child == null || builder == null); assert(debugCheckHasMaterialLocalizations(context)); final ThemeData theme = Theme.of(context); return showGeneralDialog( context: context, pageBuilder: (BuildContext buildContext, Animation animation, Animation secondaryAnimation) { final Widget pageChild = child ?? Builder(builder: builder!); return SafeArea( child: Builder(builder: (BuildContext context) { return Theme(data: theme, child: pageChild); }), ); }, barrierDismissible: barrierDismissible, ///点击背景是否消失 barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel, barrierColor: Colors.black38, ///背景色 transitionDuration: const Duration(milliseconds: 200),///动画时间 transitionBuilder: (context, animation1, animation2, child) { ///动画效果 return _buildDialogTransitions(context, animation1, animation2, child, transitionType?? TransitionType.inFromBottom); }, useRootNavigator: useRootNavigator, routeSettings: routeSettings, ); } ///返回动画效果 Widget _buildDialogTransitions( BuildContext context, Animation animaton1, Animation secondaryAnimation, Widget child, TransitionType type) { /// 渐变效果 if (type == TransitionType.fade) { return FadeTransition( // 从0开始到1 opacity: Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation( // 传入设置的动画 parent: animaton1, // 设置效果,快进漫出 这里有很多内置的效果 curve: Curves.fastOutSlowIn, )), child: child, ); ///缩放 } else if (type == TransitionType.scale) { return ScaleTransition( scale: Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation(parent: animaton1, curve: Curves.easeOutBack)),//Curves.easeOutBack child: child, ); /// 旋转加缩放动画效果 } else if (type == TransitionType.rotation) { return RotationTransition( turns: Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation( parent: animaton1, curve: Curves.fastOutSlowIn, )), child: ScaleTransition( scale: Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation(parent: animaton1, curve: Curves.fastOutSlowIn)), child: child, ), ); /// 左滑出动画效果 } else if (type == TransitionType.inFromLeft) { return SlideTransition( position: Tween(begin: Offset(-1.0, 0.0), end: Offset(0.0, 0.0)) .animate(CurvedAnimation(parent: animaton1, curve: Curves.fastOutSlowIn)), child: child, ); /// 右滑出动画效果 } else if (type == TransitionType.inFromRight) { return SlideTransition( position: Tween(begin: Offset(1.0, 0.0), end: Offset(0.0, 0.0)) .animate(CurvedAnimation(parent: animaton1, curve: Curves.fastOutSlowIn)), child: child, ); /// 顶部滑出动画效果 } else if (type == TransitionType.inFromTop) { return SlideTransition( position: Tween(begin: Offset(0.0, -1.0), end: Offset(0.0, 0.0)) .animate(CurvedAnimation(parent: animaton1, curve: Curves.fastOutSlowIn)), child: child, ); /// 底部滑出动画效果 } else if (type == TransitionType.inFromBottom) { return SlideTransition( position: Tween(begin: Offset(0.0, 1.0), end: Offset(0.0, 0.0)) .animate(CurvedAnimation(parent: animaton1, curve: Curves.fastOutSlowIn)), child: child, ); /// 放大出显动画效果 } else if (type == TransitionType.size) { return ScaleTransition( child: child, scale: Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation(parent: animaton1, curve: Curves.fastOutSlowIn)), ); } else { return child; } }