import 'package:flutter/material.dart'; class AnimatedVisibility extends StatefulWidget { final bool visible; final Widget child; final Duration duration; final Curve curve; const AnimatedVisibility({ super.key, required this.visible, required this.child, this.duration = const Duration(milliseconds: 400), this.curve = Curves.easeInOut, }); @override State createState() => _AnimatedVisibilityState(); } class _AnimatedVisibilityState extends State with SingleTickerProviderStateMixin { late final AnimationController _controller; late final Animation _fadeAnimation; @override void initState() { super.initState(); _controller = AnimationController( duration: widget.duration, vsync: this, ); _fadeAnimation = CurvedAnimation(parent: _controller, curve: widget.curve); if (widget.visible) { _controller.forward(); } } @override void didUpdateWidget(covariant AnimatedVisibility oldWidget) { super.didUpdateWidget(oldWidget); if (widget.visible != oldWidget.visible) { widget.visible ? _controller.forward() : _controller.reverse(); } } @override void dispose() { _controller.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return SizeTransition( sizeFactor: _fadeAnimation, axisAlignment: -1.0, // 从上方展开 child: FadeTransition( opacity: _fadeAnimation, child: widget.child, ), ); } }