import 'package:flutter/material.dart'; import 'package:marco/images.dart'; class SplashScreen extends StatefulWidget { final String? message; final double? logoSize; final Color? backgroundColor; const SplashScreen({ super.key, this.message, this.logoSize = 120, this.backgroundColor = Colors.white, }); @override State createState() => _SplashScreenState(); } class _SplashScreenState extends State with SingleTickerProviderStateMixin { late AnimationController _controller; late Animation _animation; @override void initState() { super.initState(); _controller = AnimationController( duration: const Duration(seconds: 1), vsync: this, )..repeat(reverse: true); _animation = Tween(begin: 0.0, end: 8.0).animate( CurvedAnimation(parent: _controller, curve: Curves.easeInOut), ); } @override void dispose() { _controller.dispose(); super.dispose(); } Widget _buildAnimatedDots() { return Row( mainAxisAlignment: MainAxisAlignment.center, children: List.generate(3, (index) { return AnimatedBuilder( animation: _animation, builder: (context, child) { double opacity; if (index == 0) { opacity = (0.3 + _animation.value / 8).clamp(0.0, 1.0); } else if (index == 1) { opacity = (0.3 + (_animation.value / 8)).clamp(0.0, 1.0); } else { opacity = (0.3 + (1 - _animation.value / 8)).clamp(0.0, 1.0); } return Container( margin: const EdgeInsets.symmetric(horizontal: 4), width: 10, height: 10, decoration: BoxDecoration( color: Colors.blueAccent.withOpacity(opacity), shape: BoxShape.circle, ), ); }, ); }), ); } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: widget.backgroundColor, body: SafeArea( child: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ // Logo with slight bounce animation ScaleTransition( scale: Tween(begin: 0.8, end: 1.0).animate( CurvedAnimation( parent: _controller, curve: Curves.easeInOut, ), ), child: SizedBox( width: widget.logoSize, height: widget.logoSize, child: Image.asset(Images.logoDark), ), ), const SizedBox(height: 20), // Text message if (widget.message != null) Text( widget.message!, textAlign: TextAlign.center, style: const TextStyle( fontSize: 18, fontWeight: FontWeight.w600, color: Colors.black87, ), ), const SizedBox(height: 30), // Animated loading dots _buildAnimatedDots(), ], ), ), ), ); } }