198 lines
5.6 KiB
Dart
198 lines
5.6 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:get/get.dart';
|
|
import 'dart:math' as math;
|
|
import 'dart:ui';
|
|
import '../controllers/splash_controller.dart';
|
|
import '../../../theme/app_colors.dart';
|
|
|
|
class SplashView extends GetView<SplashController> {
|
|
const SplashView({super.key});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final size = MediaQuery.of(context).size;
|
|
return Scaffold(
|
|
body: Container(
|
|
width: double.infinity,
|
|
height: double.infinity,
|
|
decoration: BoxDecoration(
|
|
gradient: LinearGradient(
|
|
begin: Alignment.topRight,
|
|
end: Alignment.bottomLeft,
|
|
colors: [
|
|
AppColors.primaryLight.withOpacity(0.1),
|
|
AppColors.background,
|
|
AppColors.accentLight.withOpacity(0.1),
|
|
],
|
|
),
|
|
),
|
|
child: Stack(
|
|
children: [
|
|
// Pattern overlay
|
|
Opacity(
|
|
opacity: 0.03,
|
|
child: Container(
|
|
decoration: const BoxDecoration(
|
|
image: DecorationImage(
|
|
image: AssetImage('assets/images/logo.png'), // Using logo.png which exists
|
|
repeat: ImageRepeat.repeat,
|
|
scale: 4.0,
|
|
),
|
|
),
|
|
),
|
|
),
|
|
|
|
// Accent circles
|
|
Positioned(
|
|
top: -40,
|
|
right: -20,
|
|
child: Container(
|
|
width: 150,
|
|
height: 150,
|
|
decoration: BoxDecoration(
|
|
shape: BoxShape.circle,
|
|
gradient: RadialGradient(
|
|
colors: [
|
|
AppColors.primary.withOpacity(0.2),
|
|
Colors.transparent,
|
|
],
|
|
),
|
|
),
|
|
),
|
|
),
|
|
|
|
Positioned(
|
|
bottom: -50,
|
|
left: -30,
|
|
child: Container(
|
|
width: 180,
|
|
height: 180,
|
|
decoration: BoxDecoration(
|
|
shape: BoxShape.circle,
|
|
gradient: RadialGradient(
|
|
colors: [
|
|
AppColors.accent.withOpacity(0.2),
|
|
Colors.transparent,
|
|
],
|
|
),
|
|
),
|
|
),
|
|
),
|
|
|
|
// Main content
|
|
Center(
|
|
child: Column(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: [
|
|
// Animated Logo
|
|
TweenAnimationBuilder<double>(
|
|
tween: Tween<double>(begin: 0, end: 1),
|
|
duration: const Duration(seconds: 1),
|
|
curve: Curves.easeOutBack,
|
|
builder: (context, value, child) {
|
|
return Transform.scale(
|
|
scale: value,
|
|
child: Image.asset(
|
|
'assets/images/logo.png',
|
|
width: 180,
|
|
height: 180,
|
|
fit: BoxFit.contain,
|
|
errorBuilder: (context, error, stackTrace) {
|
|
return Icon(
|
|
Icons.business,
|
|
size: 100,
|
|
color: AppColors.primary,
|
|
);
|
|
},
|
|
),
|
|
);
|
|
},
|
|
),
|
|
const SizedBox(height: 40),
|
|
|
|
// Animated loading indicator
|
|
_DelayedAnimation(
|
|
delay: 400,
|
|
child: Column(
|
|
children: [
|
|
SizedBox(
|
|
width: 40,
|
|
height: 40,
|
|
child: CircularProgressIndicator(
|
|
valueColor: AlwaysStoppedAnimation<Color>(
|
|
AppColors.primary,
|
|
),
|
|
strokeWidth: 3,
|
|
),
|
|
),
|
|
const SizedBox(height: 16),
|
|
],
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
// Animation helper class
|
|
class _DelayedAnimation extends StatefulWidget {
|
|
final Widget child;
|
|
final int delay;
|
|
|
|
const _DelayedAnimation({required this.child, required this.delay});
|
|
|
|
@override
|
|
_DelayedAnimationState createState() => _DelayedAnimationState();
|
|
}
|
|
|
|
class _DelayedAnimationState extends State<_DelayedAnimation>
|
|
with SingleTickerProviderStateMixin {
|
|
late AnimationController _controller;
|
|
late Animation<Offset> _animOffset;
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
|
|
_controller = AnimationController(
|
|
vsync: this,
|
|
duration: const Duration(milliseconds: 800),
|
|
);
|
|
|
|
final curve = CurvedAnimation(
|
|
parent: _controller,
|
|
curve: Curves.decelerate,
|
|
);
|
|
|
|
_animOffset = Tween<Offset>(
|
|
begin: const Offset(0.0, 0.35),
|
|
end: Offset.zero,
|
|
).animate(curve);
|
|
|
|
Future.delayed(Duration(milliseconds: widget.delay), () {
|
|
if (mounted) {
|
|
_controller.forward();
|
|
}
|
|
});
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
_controller.dispose();
|
|
super.dispose();
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return FadeTransition(
|
|
opacity: _controller,
|
|
child: SlideTransition(position: _animOffset, child: widget.child),
|
|
);
|
|
}
|
|
}
|