Files
mobile-app/lib/features/splash/presentation/screens/splash_screen.dart

116 lines
3.1 KiB
Dart
Raw Normal View History

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:real_estate_mobile/core/constants/app_colors.dart';
class SplashScreen extends StatefulWidget {
const SplashScreen({super.key});
@override
State<SplashScreen> createState() => _SplashScreenState();
}
class _SplashScreenState extends State<SplashScreen>
with SingleTickerProviderStateMixin {
late final AnimationController _controller;
late final Animation<double> _fadeAnimation;
Timer? _navigationTimer;
@override
void initState() {
super.initState();
_controller = AnimationController(
vsync: this,
duration: const Duration(milliseconds: 800),
);
_fadeAnimation = CurvedAnimation(
parent: _controller,
curve: Curves.easeIn,
);
_controller.forward();
_navigationTimer = Timer(const Duration(seconds: 3), _navigate);
}
Future<void> _navigate() async {
if (!mounted) return;
final prefs = await SharedPreferences.getInstance();
final onboardingCompleted = prefs.getBool('onboarding_completed') ?? false;
if (!mounted) return;
if (onboardingCompleted) {
context.go('/home');
} else {
context.go('/onboarding');
}
}
@override
void dispose() {
_navigationTimer?.cancel();
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
width: double.infinity,
height: double.infinity,
decoration: const BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
colors: [
AppColors.gradientStart,
AppColors.gradientEnd,
],
),
),
child: FadeTransition(
opacity: _fadeAnimation,
child: Center(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 40),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
SizedBox(
width: 150,
height: 108,
child: Image.asset(
'assets/images/splash_house.png',
width: 150,
height: 108,
fit: BoxFit.contain,
semanticLabel: 'House illustration',
),
),
const SizedBox(height: 35),
SizedBox(
width: 264,
height: 55,
child: Image.asset(
'assets/images/splash_logo.png',
width: 264,
height: 55,
fit: BoxFit.contain,
semanticLabel: 'RE-Quest logo',
),
),
],
),
),
),
),
),
);
}
}