60 lines
1.5 KiB
Dart
60 lines
1.5 KiB
Dart
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<FadeInUp> createState() => _FadeInUpState();
|
|
}
|
|
|
|
class _FadeInUpState extends State<FadeInUp> with SingleTickerProviderStateMixin {
|
|
late AnimationController _controller;
|
|
late Animation<double> _fade;
|
|
late Animation<Offset> _slide;
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
_controller = AnimationController(
|
|
vsync: this, duration: Duration(milliseconds: widget.durationMs));
|
|
_fade = Tween<double>(begin: 0.0, end: 1.0)
|
|
.animate(CurvedAnimation(parent: _controller, curve: Curves.easeOutCubic));
|
|
_slide = Tween<Offset>(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,
|
|
),
|
|
);
|
|
}
|
|
}
|