TKK_E32231651/lib/splash_screen.dart

204 lines
6.5 KiB
Dart

import 'package:flutter/material.dart';
import 'dart:async';
import 'early_screen.dart';
class SplashScreen extends StatefulWidget {
const SplashScreen({super.key});
@override
State<SplashScreen> createState() => _SplashScreenState();
}
class _SplashScreenState extends State<SplashScreen> {
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<Color>(
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,
),
);
}
}