import 'package:flutter/material.dart'; class FikoYTRippleWave extends StatefulWidget { const FikoYTRippleWave({ super.key, this.color = Colors.yellowAccent, this.duration = const Duration(milliseconds: 1500), this.delay = Duration.zero, this.repeat = true, required this.child, this.childTween, this.animationController, this.waveCount = 2, }); /// Ripple rengi final Color color; /// İçindeki widget final Widget child; /// İç widget için Tween efekti final Tween? childTween; /// Animasyon süresi final Duration duration; final Duration delay; /// Animasyonun tekrar etme durumu final bool repeat; /// Harici animasyon kontrolcüsü (isteğe bağlı) final AnimationController? animationController; /// Dalga sayısı final int waveCount; @override State createState() => FikoYTRippleWaveState(); } class FikoYTRippleWaveState extends State with TickerProviderStateMixin { late AnimationController _controller; @override void initState() { super.initState(); _initializeController(); } void _initializeController() { _controller = widget.animationController ?? AnimationController( duration: widget.duration, vsync: this, ); _controller.addStatusListener((status) { if (status == AnimationStatus.completed) { _controller.value = 0; Future.delayed(widget.delay, () { if (mounted && widget.repeat) { _controller.forward(from: 0.0); } }); } }); if (widget.repeat) { _controller.forward(); } else if (widget.animationController == null) { _controller.forward(); } } @override void didUpdateWidget(covariant FikoYTRippleWave oldWidget) { super.didUpdateWidget(oldWidget); if (oldWidget.repeat != widget.repeat) { if (widget.repeat) { _controller.repeat(); } else { _controller.stop(); } } if (oldWidget.duration != widget.duration) { _controller.dispose(); _initializeController(); } } @override void dispose() { if (widget.animationController == null) { _controller.dispose(); } super.dispose(); } @override Widget build(BuildContext context) { return CustomPaint( painter: _RipplePainter( _controller, widget.waveCount, color: widget.color, ), child: RepaintBoundary( child: Center( child: ClipRRect( borderRadius: BorderRadius.circular(100), child: DecoratedBox( decoration: BoxDecoration( gradient: RadialGradient( colors: [ widget.color, Colors.transparent, ], ), ), child: widget.child, ), ), ), ), ); } }