weui_toast.dart 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. part of cool_ui;
  2. class WeuiToast extends TransitionRoute{
  3. OverlayEntry _toastBarrier;
  4. final Widget message;
  5. final Widget icon;
  6. final RouteTransitionsBuilder _transitionBuilder;
  7. final Duration closeDuration;
  8. WeuiToast({
  9. @required this.message,
  10. @required this.icon,
  11. Duration transitionDuration = const Duration(milliseconds: 100),
  12. RouteTransitionsBuilder transitionBuilder,
  13. this.closeDuration
  14. }):assert(icon != null),
  15. assert(message!=null),
  16. _transitionDuration = transitionDuration,
  17. _transitionBuilder = transitionBuilder;
  18. @override
  19. void didChangePrevious(Route<dynamic> previousRoute) {
  20. super.didChangePrevious(previousRoute);
  21. changedInternalState();
  22. }
  23. @override
  24. void changedInternalState() {
  25. super.changedInternalState();
  26. _toastBarrier.markNeedsBuild();
  27. }
  28. @override
  29. Iterable<OverlayEntry> createOverlayEntries() sync* {
  30. yield _toastBarrier = OverlayEntry(builder: _buildToastBarrier);
  31. yield OverlayEntry(builder: _buildToastScope, maintainState: true);
  32. }
  33. // TODO: implement opaque
  34. @override
  35. bool get opaque => false;
  36. // TODO: implement transitionDuration
  37. @override
  38. Duration get transitionDuration => _transitionDuration;
  39. final Duration _transitionDuration;
  40. Widget _buildToastBarrier(BuildContext context){
  41. return IgnorePointer(
  42. ignoring: true,
  43. );
  44. }
  45. Widget _buildToastScope(BuildContext context){
  46. return Material(
  47. color: Colors.transparent,
  48. child: Column(
  49. mainAxisSize: MainAxisSize.min,
  50. children: <Widget>[
  51. Padding(
  52. padding: EdgeInsets.only(top: 180.0),
  53. child: AnimatedBuilder(
  54. animation: animation,
  55. builder: (context,child){
  56. return _buildTransition(context,animation,secondaryAnimation,child);
  57. },
  58. child: Container(
  59. width: 122.0,
  60. decoration: BoxDecoration(
  61. color: Color.fromRGBO(17, 17, 17, 0.7),
  62. borderRadius: BorderRadius.circular(5.0)
  63. ),
  64. constraints: BoxConstraints(
  65. minHeight: 122.0,
  66. ),
  67. child: Column(
  68. children: <Widget>[
  69. Container(
  70. margin: EdgeInsets.only(top: 22.0),
  71. constraints:BoxConstraints(
  72. minHeight: 55.0
  73. ) ,
  74. child: IconTheme(data: IconThemeData(color: Colors.white,size: 55.0), child: icon),
  75. ),
  76. DefaultTextStyle(
  77. style: TextStyle(
  78. color: Colors.white,
  79. fontSize: 16.0
  80. ),
  81. child: message,
  82. ),
  83. ],
  84. ),
  85. ),
  86. ),
  87. )
  88. ],
  89. ),
  90. );
  91. }
  92. Widget _buildTransition( BuildContext context,
  93. Animation<double> animation,
  94. Animation<double> secondaryAnimation,
  95. Widget child){
  96. if (_transitionBuilder == null) {
  97. return FadeTransition(
  98. opacity: CurvedAnimation(
  99. parent: animation,
  100. curve: Curves.linear,
  101. ),
  102. child: child);
  103. } // Some default transition
  104. return _transitionBuilder(context, animation, secondaryAnimation, child);
  105. }
  106. }
  107. Future showWeuiSuccessToast({
  108. @required BuildContext context,
  109. @required Widget message=const Text("成功"),
  110. RouteTransitionsBuilder transitionBuilder,
  111. Duration closeDuration = const Duration(seconds: 3)
  112. }){
  113. var hide = showWeuiToast(
  114. context: context,
  115. message: message,
  116. icon: Icon(CoolUIIcons.success_no_circle),
  117. transitionBuilder:transitionBuilder);
  118. return Future.delayed(closeDuration,(){
  119. hide();
  120. });
  121. }
  122. VoidCallback showWeuiLoadingToast({
  123. @required BuildContext context,
  124. @required Widget message,
  125. RouteTransitionsBuilder transitionBuilder
  126. }){
  127. return showWeuiToast(
  128. context: context,
  129. message: message,
  130. icon: WeuiLoadingIcon(),
  131. transitionBuilder:transitionBuilder);
  132. }
  133. VoidCallback showWeuiToast({
  134. @required BuildContext context,
  135. @required Widget message,
  136. @required Widget icon,
  137. RouteTransitionsBuilder transitionBuilder}){
  138. Completer<VoidCallback> result = Completer<VoidCallback>();
  139. Navigator.of(context,rootNavigator: true).push(
  140. WeuiToast(
  141. message: Builder(builder: (context){
  142. result.complete(()=>Navigator.pop(context));
  143. return message;
  144. }),
  145. icon: icon,
  146. transitionBuilder:transitionBuilder));
  147. return (){
  148. result.future.then((hide){
  149. hide();
  150. });
  151. };
  152. }
  153. class WeuiLoadingIcon extends StatefulWidget{
  154. final double size;
  155. WeuiLoadingIcon({this.size = 50.0});
  156. @override
  157. State<StatefulWidget> createState() => WeuiLoadingIconState();
  158. }
  159. class WeuiLoadingIconState extends State<WeuiLoadingIcon>
  160. with SingleTickerProviderStateMixin
  161. {
  162. AnimationController _controller;
  163. Animation<double> _doubleAnimation;
  164. @override
  165. void initState() {
  166. super.initState();
  167. _controller = new AnimationController(
  168. vsync: this, duration: Duration(milliseconds: 1000))
  169. ..repeat();
  170. _doubleAnimation= Tween(begin: 0.0,end: 360.0).animate(_controller)..addListener((){
  171. setState(() {
  172. });
  173. });
  174. }
  175. @override
  176. void dispose() {
  177. // TODO: implement dispose
  178. _controller.dispose();
  179. super.dispose();
  180. }
  181. @override
  182. Widget build(BuildContext context) {
  183. return Transform.rotate(
  184. angle: (_doubleAnimation.value / 30).toInt() * 30.0 * 0.0174533,
  185. child: Image.asset("assets/images/loading.png",
  186. package: "cool_ui",
  187. width: widget.size,
  188. height: widget.size)
  189. );
  190. }
  191. }