Files
ai_english/client/lib/features/auth/screens/splash_screen.dart
2025-11-17 13:39:05 +08:00

149 lines
4.5 KiB
Dart

import 'package:flutter/material.dart';
import '../../../core/theme/app_colors.dart';
import '../../../core/theme/app_text_styles.dart';
import '../../../core/theme/app_dimensions.dart';
/// 启动页面
class SplashScreen extends StatefulWidget {
const SplashScreen({super.key});
@override
State<SplashScreen> createState() => _SplashScreenState();
}
class _SplashScreenState extends State<SplashScreen>
with SingleTickerProviderStateMixin {
late AnimationController _animationController;
late Animation<double> _fadeAnimation;
late Animation<double> _scaleAnimation;
@override
void initState() {
super.initState();
_initAnimations();
_navigateToNext();
}
void _initAnimations() {
_animationController = AnimationController(
duration: const Duration(milliseconds: 2000),
vsync: this,
);
_fadeAnimation = Tween<double>(
begin: 0.0,
end: 1.0,
).animate(CurvedAnimation(
parent: _animationController,
curve: const Interval(0.0, 0.6, curve: Curves.easeIn),
));
_scaleAnimation = Tween<double>(
begin: 0.8,
end: 1.0,
).animate(CurvedAnimation(
parent: _animationController,
curve: const Interval(0.2, 0.8, curve: Curves.elasticOut),
));
_animationController.forward();
}
Future<void> _navigateToNext() async {
await Future.delayed(const Duration(seconds: 3));
if (mounted) {
// TODO: 检查用户登录状态,决定跳转到登录页还是主页
Navigator.of(context).pushReplacementNamed('/login');
}
}
@override
void dispose() {
_animationController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: AppColors.primary,
body: Center(
child: AnimatedBuilder(
animation: _animationController,
builder: (context, child) {
return FadeTransition(
opacity: _fadeAnimation,
child: ScaleTransition(
scale: _scaleAnimation,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
// 应用图标
Container(
width: AppDimensions.iconXxl * 2,
height: AppDimensions.iconXxl * 2,
decoration: BoxDecoration(
color: AppColors.onPrimary,
borderRadius: BorderRadius.circular(
AppDimensions.radiusXl,
),
boxShadow: [
BoxShadow(
color: AppColors.shadow.withOpacity(0.3),
blurRadius: 20,
offset: const Offset(0, 10),
),
],
),
child: Icon(
Icons.school,
size: AppDimensions.iconXxl,
color: AppColors.primary,
),
),
SizedBox(height: AppDimensions.spacingXl),
// 应用名称
Text(
'AI English Learning',
style: AppTextStyles.headlineLarge.copyWith(
color: AppColors.onPrimary,
fontWeight: FontWeight.bold,
),
),
SizedBox(height: AppDimensions.spacingMd),
// 副标题
Text(
'智能英语学习助手',
style: AppTextStyles.bodyLarge.copyWith(
color: AppColors.onPrimary.withOpacity(0.8),
),
),
SizedBox(height: AppDimensions.spacingXxl),
// 加载指示器
SizedBox(
width: 40,
height: 40,
child: CircularProgressIndicator(
valueColor: AlwaysStoppedAnimation<Color>(
AppColors.onPrimary,
),
strokeWidth: 3,
),
),
],
),
),
);
},
),
),
);
}
}