import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import 'package:get/get.dart'; import 'package:vbvs_app/common/util/FitTool.dart'; import 'package:vbvs_app/common/util/MyUtils.dart'; import 'package:vbvs_app/controller/theme_controller/ThemeController.dart'; class TopSlideNotification extends StatefulWidget { final String text; double? fontSize = 26.rpx; Color? textColor; double? slideOffset = 200; final Duration duration; TopSlideNotification({ super.key, this.text = '操作成功!', this.fontSize, this.textColor, this.slideOffset, this.duration = const Duration(seconds: 2), }); @override State createState() => _TopSlideNotificationState(); /// 工具方法:调用时直接加进 Overlay 上 static void show( BuildContext context, { String text = '操作成功!', double fontSize = 16, Color? textColor, double slideOffset = 300.0, Duration duration = const Duration(seconds: 2), }) { final overlay = Overlay.of(context); final entry = OverlayEntry( builder: (_) => TopSlideNotification( text: text, fontSize: fontSize, textColor: textColor, slideOffset: slideOffset, duration: duration, ), ); overlay.insert(entry); Future.delayed(duration + const Duration(milliseconds: 500), () { entry.remove(); }); } } class _TopSlideNotificationState extends State with SingleTickerProviderStateMixin { late AnimationController _controller; late Animation _animation; @override void initState() { super.initState(); _controller = AnimationController( duration: const Duration(milliseconds: 300), vsync: this, ); SchedulerBinding.instance.addPostFrameCallback((_) async { await _controller.forward(); await Future.delayed(widget.duration); await _controller.reverse(); }); } @override void didChangeDependencies() { super.didChangeDependencies(); final screenHeight = MediaQuery.of(context).size.height; final offsetValue = widget.slideOffset! / screenHeight; _animation = Tween( begin: const Offset(0, -1), end: Offset(0, offsetValue), ).animate(CurvedAnimation( parent: _controller, curve: Curves.easeOut, reverseCurve: Curves.easeIn, )); } @override void dispose() { _controller.dispose(); super.dispose(); } Color get _textColor { return widget.textColor ?? Get.find().currentColor.sc2; } @override Widget build(BuildContext context) { return Positioned( top: 0, left: 0, right: 0, child: SlideTransition( position: _animation, child: Material( color: stringToColor("#000000").withOpacity(0.8), child: Padding( padding: const EdgeInsets.symmetric(vertical: 20.0), child: Container( // color: Colors.red, child: Text( widget.text, textAlign: TextAlign.center, style: TextStyle( fontSize: widget.fontSize, color: _textColor, ), ), ), ), ), ), ); } }