import 'package:flutter/material.dart'; import 'dart:async'; import 'early_screen.dart'; class SplashScreen extends StatefulWidget { const SplashScreen({super.key}); @override State createState() => _SplashScreenState(); } class _SplashScreenState extends State { double _loadingProgress = 0.0; Timer? _timer; Timer? _navigationTimer; @override void initState() { super.initState(); // Loading bar animation dari 0% ke 100% dalam 3 detik _timer = Timer.periodic(const Duration(milliseconds: 30), (timer) { setState(() { if (_loadingProgress < 1.0) { _loadingProgress += 0.01; } else { _timer?.cancel(); } }); }); // Navigate setelah 3.5 detik _navigationTimer = Timer(const Duration(milliseconds: 3500), () { if (mounted) { Navigator.pushReplacement( context, MaterialPageRoute( builder: (context) => const EarlyScreen(), ), ); } }); } @override void dispose() { _timer?.cancel(); _navigationTimer?.cancel(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( body: Container( decoration: BoxDecoration( gradient: LinearGradient( begin: Alignment.topCenter, end: Alignment.bottomCenter, colors: [ Colors.red.shade900, // Merah sangat tua Colors.red.shade800, // Merah tua Colors.red.shade700, // Merah gelap Colors.red.shade600, // Merah sedang Colors.red.shade500, // Merah terang Colors.white.withOpacity(0.95), // Putih sedikit di paling bawah ], stops: const [0.0, 0.2, 0.4, 0.6, 0.8, 1.0], ), ), child: SafeArea( child: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ // Logo dengan efek glow merah Container( decoration: BoxDecoration( shape: BoxShape.circle, boxShadow: [ BoxShadow( blurRadius: 40, color: Colors.red.shade300.withOpacity(0.6), spreadRadius: 5, ), ], ), child: Image.asset( "assets/logo.png", width: 150, height: 150, ), ), const SizedBox(height: 40), // Nama Aplikasi ShaderMask( shaderCallback: (bounds) => LinearGradient( colors: [Colors.white, Colors.red.shade100], ).createShader(bounds), child: const Text( 'Kopikaocare', style: TextStyle( fontSize: 32, fontWeight: FontWeight.bold, color: Colors.white, letterSpacing: 3, ), ), ), const SizedBox(height: 10), const Text( 'Kopi Kesehatan Anda', style: TextStyle( fontSize: 14, color: Colors.white70, letterSpacing: 1.5, ), ), const SizedBox(height: 80), // Loading Bar Container Padding( padding: const EdgeInsets.symmetric(horizontal: 60), child: Column( children: [ // Loading Bar Background Container( width: double.infinity, height: 6, decoration: BoxDecoration( color: Colors.white.withOpacity(0.2), borderRadius: BorderRadius.circular(10), ), child: ClipRRect( borderRadius: BorderRadius.circular(10), child: LinearProgressIndicator( value: _loadingProgress, backgroundColor: Colors.transparent, valueColor: const AlwaysStoppedAnimation( Colors.white, ), ), ), ), const SizedBox(height: 12), // Persentase Loading Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ const Text( 'Memuat...', style: TextStyle( fontSize: 12, color: Colors.white70, letterSpacing: 0.5, ), ), Text( '${(_loadingProgress * 100).toInt()}%', style: const TextStyle( fontSize: 14, fontWeight: FontWeight.bold, color: Colors.white, letterSpacing: 0.5, ), ), ], ), ], ), ), const SizedBox(height: 30), // Loading dots Row( mainAxisAlignment: MainAxisAlignment.center, children: [ _buildDot(0), _buildDot(1), _buildDot(2), ], ), ], ), ), ), ), ); } Widget _buildDot(int index) { return AnimatedContainer( duration: const Duration(milliseconds: 500), margin: const EdgeInsets.symmetric(horizontal: 4), width: 6, height: 6, decoration: BoxDecoration( color: Colors.white.withOpacity( _loadingProgress > 0.3 * (index + 1) ? 1.0 : 0.2, ), shape: BoxShape.circle, ), ); } }