import 'package:flutter/material.dart'; class FadeInUp extends StatefulWidget { final Widget child; final int delayMs; final int durationMs; const FadeInUp({ Key? key, required this.child, this.delayMs = 0, this.durationMs = 500, }) : super(key: key); @override State createState() => _FadeInUpState(); } class _FadeInUpState extends State with SingleTickerProviderStateMixin { late AnimationController _controller; late Animation _fade; late Animation _slide; @override void initState() { super.initState(); _controller = AnimationController( vsync: this, duration: Duration(milliseconds: widget.durationMs)); _fade = Tween(begin: 0.0, end: 1.0) .animate(CurvedAnimation(parent: _controller, curve: Curves.easeOutCubic)); _slide = Tween(begin: const Offset(0, 0.15), end: Offset.zero) .animate(CurvedAnimation(parent: _controller, curve: Curves.easeOutCubic)); if (widget.delayMs == 0) { _controller.forward(); } else { Future.delayed(Duration(milliseconds: widget.delayMs), () { if (mounted) _controller.forward(); }); } } @override void dispose() { _controller.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return FadeTransition( opacity: _fade, child: SlideTransition( position: _slide, child: widget.child, ), ); } }