feat: implement a new splash screen with custom branding, assets, and routing for both Android and iOS.

This commit is contained in:
pradeepkumar
2026-03-10 22:46:48 +05:30
parent 5e2f42af2f
commit 792965f717
14 changed files with 142 additions and 16 deletions

View File

@@ -0,0 +1,90 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:go_router/go_router.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), () {
if (mounted) {
context.go('/home');
}
});
}
@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: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Image.asset(
'assets/images/splash_house.png',
width: 150,
fit: BoxFit.contain,
semanticLabel: 'House illustration',
),
const SizedBox(height: 35),
Image.asset(
'assets/images/splash_logo.png',
width: 264,
fit: BoxFit.contain,
semanticLabel: 'RE-Quest logo',
),
],
),
),
),
);
}
}

View File

@@ -20,6 +20,7 @@ import 'package:real_estate_mobile/features/profile/presentation/screens/profile
import 'package:real_estate_mobile/features/notifications/presentation/screens/notifications_screen.dart';
import 'package:real_estate_mobile/features/agents/presentation/screens/agent_edit_profile_screen.dart';
import 'package:real_estate_mobile/features/profile/presentation/screens/payment_success_screen.dart';
import 'package:real_estate_mobile/features/splash/presentation/screens/splash_screen.dart';
final routerProvider = Provider<GoRouter>((ref) {
final authRefreshNotifier = _AuthRefreshNotifier();
@@ -37,7 +38,7 @@ final routerProvider = Provider<GoRouter>((ref) {
const authRoutes = ['/login', '/signup'];
return GoRouter(
initialLocation: '/home',
initialLocation: '/splash',
refreshListenable: authRefreshNotifier,
redirect: (context, state) {
final authState = ref.read(authProvider);
@@ -50,6 +51,9 @@ final routerProvider = Provider<GoRouter>((ref) {
(route) => location == route || location.startsWith('$route/'),
);
// Never redirect away from splash — it handles its own navigation
if (location == '/splash') return null;
// While checking auth status, don't redirect
if (isLoading) return null;
@@ -65,6 +69,12 @@ final routerProvider = Provider<GoRouter>((ref) {
return null;
},
routes: [
// Splash screen (full screen, no shell)
GoRoute(
path: '/splash',
builder: (context, state) => const SplashScreen(),
),
// Auth routes (no shell — full screen)
GoRoute(
path: '/login',