这里有一个小部件,它将闪烁的动画添加到传递给它的任何小部件中:
class BlinkingWidget extends StatefulWidget {
final Widget child;
final Duration? duration;
const BlinkingWidget({
super.key,
required this.child,
this.duration,
});
@override
State<BlinkingWidget> createState() => _BlinkingWidgetState();
}
class _BlinkingWidgetState extends State<BlinkingWidget>
with SingleTickerProviderStateMixin {
late final AnimationController _controller;
@override
initState() {
super.initState();
_controller = AnimationController(
duration: widget.duration ?? const Duration(milliseconds: 1000),
vsync: this,
);
_controller.addStatusListener((status) {
if (status == AnimationStatus.completed) {
_controller.reverse();
} else if (status == AnimationStatus.dismissed) {
_controller.forward();
}
});
_controller.forward();
}
@override
dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) => AnimatedBuilder(
animation: _controller,
builder: (context, child) => Opacity(
opacity: _controller.value,
child: widget.child,
),
child: widget.child,
);
}
您可以调用BlinkingWidget传递您想要的小部件,在您的情况下是一个红色圆圈:
class HomePage extends StatelessWidget {
const HomePage({super.key});
@override
Widget build(BuildContext context) => Scaffold(
body: Center(
child: BlinkingWidget(
child: Container(
height: 50,
width: 50,
decoration: const BoxDecoration(
shape: BoxShape.circle,
color: Colors.red,
),
),
),
),
);
}
通过拥有一个只负责添加闪烁动画的小部件,您可以随时随地重用它,还可以使用不同的小部件。