Jaga-Jalan/android/lib/splash_screen.dart

141 lines
3.8 KiB
Dart

import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import './config/theme_colors.dart';
import 'login_page.dart';
import 'dashboard_page.dart';
class SplashScreen extends StatefulWidget {
const SplashScreen({Key? key}) : super(key: key);
@override
_SplashScreenState createState() => _SplashScreenState();
}
class _SplashScreenState extends State<SplashScreen> with TickerProviderStateMixin {
late AnimationController _fadeController;
late AnimationController _moveController;
late Animation<double> _fadeAnimation;
late Animation<double> _scaleAnimation;
late Animation<Offset> _slideAnimation;
@override
void initState() {
super.initState();
// Controller untuk fade in
_fadeController = AnimationController(
duration: const Duration(seconds: 2),
vsync: this,
);
// Controller untuk animasi bergerak
_moveController = AnimationController(
duration: const Duration(milliseconds: 800),
vsync: this,
);
_fadeAnimation = CurvedAnimation(
parent: _fadeController,
curve: Curves.easeIn,
);
_scaleAnimation = Tween<double>(
begin: 1.0,
end: 1.0,
).animate(CurvedAnimation(
parent: _moveController,
curve: Curves.easeInOut,
));
_slideAnimation = Tween<Offset>(
begin: Offset.zero,
end: Offset(0, -1.03),
).animate(CurvedAnimation(
parent: _moveController,
curve: Curves.easeInOut,
));
_fadeController.forward();
Future.delayed(Duration(seconds: 3), () {
_moveController.forward().then((_) {
checkLoginStatus();
});
});
}
Future<void> checkLoginStatus() async {
final prefs = await SharedPreferences.getInstance();
final token = prefs.getString('token');
Navigator.pushReplacement(
context,
PageRouteBuilder(
pageBuilder: (context, animation, secondaryAnimation) =>
token != null ? DashboardPage() : LoginPage(),
transitionsBuilder: (context, animation, secondaryAnimation, child) {
return FadeTransition(
opacity: animation,
child: child,
);
},
transitionDuration: Duration(milliseconds: 500),
),
);
}
@override
void dispose() {
_fadeController.dispose();
_moveController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
final isDarkMode = Theme.of(context).brightness == Brightness.dark;
return Scaffold(
backgroundColor: ThemeColors.primary(context),
body: Stack(
children: [
// Background image
Positioned.fill(
child: Image.asset(
isDarkMode
? 'assets/images/background_dark.png'
: 'assets/images/background_light.png',
fit: BoxFit.cover,
),
),
// Logo dengan animasi
Center(
child: FadeTransition(
opacity: _fadeAnimation,
child: SlideTransition(
position: _slideAnimation,
child: ScaleTransition(
scale: _scaleAnimation,
child: Container(
width: 200,
height: 200,
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage(
isDarkMode
? 'assets/images/logo_dark.png'
: 'assets/images/logo_light.png'
),
fit: BoxFit.contain,
),
),
),
),
),
),
),
],
),
);
}
}