import 'package:flutter/material.dart'; class SCShiningText extends StatefulWidget { final String text; final double fontSize; final FontWeight fontWeight; final Color baseColor; final Color shineColor; const SCShiningText({ super.key, required this.text, this.fontSize = 24, this.fontWeight = FontWeight.bold, this.baseColor = Colors.grey, this.shineColor = Colors.white, }); @override State createState() => _ShiningText1State(); } class _ShiningText1State extends State with SingleTickerProviderStateMixin { late AnimationController _controller; late Animation _animation; @override void initState() { super.initState(); _controller = AnimationController( duration: const Duration(milliseconds: 3000), vsync: this, )..repeat(reverse: false); _animation = Tween(begin: -1.0, end: 2.0).animate(_controller); } @override Widget build(BuildContext context) { return Center( child: AnimatedBuilder( animation: _animation, builder: (context, child) { return ShaderMask( blendMode: BlendMode.srcIn, shaderCallback: (Rect bounds) { return LinearGradient( colors: [ widget.baseColor, widget.shineColor, widget.shineColor, widget.baseColor, ], stops: const [0.0, 0.1, 0.9, 1.0], transform: _GradientTransform(_animation.value), ).createShader(bounds); }, child: Text( widget.text, style: TextStyle( fontSize: widget.fontSize, fontWeight: widget.fontWeight, ), ), ); }, ), ); } @override void dispose() { _controller.dispose(); super.dispose(); } } class _GradientTransform extends GradientTransform { final double value; const _GradientTransform(this.value); @override Matrix4 transform(Rect bounds, {TextDirection? textDirection}) { return Matrix4.translationValues(bounds.width * value, 0.0, 0.0); } }