| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- 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<AnimatedVisibility> createState() => _AnimatedVisibilityState();
- }
- class _AnimatedVisibilityState extends State<AnimatedVisibility>
- with SingleTickerProviderStateMixin {
- late final AnimationController _controller;
- late final Animation<double> _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,
- ),
- );
- }
- }
|