rwadurian/frontend/mobile-app/lib/features/auth/presentation/pages/splash_page.dart

182 lines
5.9 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import '../../../../core/constants/app_constants.dart';
import '../../../../routes/route_paths.dart';
import '../../../../routes/app_router.dart';
import '../../../../bootstrap.dart';
import '../providers/auth_provider.dart';
/// 开屏页面 - 应用启动时显示的第一个页面
/// 显示 Logo 和应用名称,同时检查用户认证状态
class SplashPage extends ConsumerStatefulWidget {
const SplashPage({super.key});
@override
ConsumerState<SplashPage> createState() => _SplashPageState();
}
class _SplashPageState extends ConsumerState<SplashPage> {
@override
void initState() {
super.initState();
_initializeApp();
}
/// 初始化应用并检查认证状态
Future<void> _initializeApp() async {
// 初始化遥测服务(需要 BuildContext
await initializeTelemetry(context);
// 等待开屏动画展示
await Future.delayed(AppConstants.splashDuration);
// 检查认证状态
await ref.read(authProvider.notifier).checkAuthStatus();
if (!mounted) return;
final authState = ref.read(authProvider);
// 根据认证状态决定跳转目标
// 优先级:
// 1. 钱包已创建且已备份 → 主页面
// 2. 账号已创建但钱包未完成 → 备份助记词页面
// 3. 首次打开或未看过向导 → 向导页
// 4. 其他情况 → 创建账户页面
if (authState.isWalletCreated) {
// 已创建钱包且已备份,进入主页面(龙虎榜)
debugPrint('[SplashPage] 钱包已创建且已备份 → 跳转到龙虎榜');
context.go(RoutePaths.ranking);
} else if (authState.isAccountCreated && authState.userSerialNum != null) {
// 账号已创建但钱包未完成(可能正在生成或未备份),直接进入备份助记词页面
debugPrint('[SplashPage] 账号已创建但钱包未完成 → 跳转到备份助记词页面');
debugPrint('[SplashPage] userSerialNum: ${authState.userSerialNum}, isWalletReady: ${authState.isWalletReady}');
context.go(
RoutePaths.backupMnemonic,
extra: BackupMnemonicParams(
userSerialNum: authState.userSerialNum!,
referralCode: authState.referralCode,
),
);
} else if (authState.isFirstLaunch || !authState.hasSeenGuide) {
// 首次打开或未看过向导,进入向导页
debugPrint('[SplashPage] 首次打开或未看过向导 → 跳转到向导页');
context.go(RoutePaths.guide);
} else {
// 已看过向导但未创建钱包,直接进入创建账户页面
debugPrint('[SplashPage] 已看过向导但未创建钱包 → 跳转到创建账户页面');
context.go(RoutePaths.onboarding);
}
// 获取目标路由用于后续检查
final targetRoute = authState.isWalletCreated ? RoutePaths.ranking : null;
// 延迟检查应用更新(跳转后执行,避免阻塞启动)
if (targetRoute == RoutePaths.ranking) {
// 只在进入主页面时检查更新
checkForAppUpdate(context);
}
}
@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: [
Color(0xFFFFF5E6), // 浅米色
Color(0xFFFFE4B5), // 金黄色
],
),
),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
// Logo 图片容器
_buildLogo(),
const SizedBox(height: 24),
// 应用名称
_buildAppTitle(),
],
),
),
);
}
/// 构建 Logo 组件
/// 深色背景上的皇冠图标
Widget _buildLogo() {
return Container(
width: 128,
height: 152,
decoration: BoxDecoration(
color: const Color(0xFF2D2A26), // 深棕色背景
borderRadius: BorderRadius.circular(8),
),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
// 皇冠图标
Container(
width: 64,
height: 48,
decoration: BoxDecoration(
color: const Color(0xFFD4A84B), // 金色
borderRadius: BorderRadius.circular(8),
),
child: const Icon(
Icons.workspace_premium,
size: 32,
color: Color(0xFF2D2A26),
),
),
const SizedBox(height: 16),
// DURIAN 文字
const Text(
'DURIAN',
style: TextStyle(
fontSize: 12,
fontWeight: FontWeight.w600,
letterSpacing: 2,
color: Color(0xFFD4A84B),
),
),
const SizedBox(height: 2),
// QUEEN 文字
const Text(
'QUEEN',
style: TextStyle(
fontSize: 10,
fontWeight: FontWeight.w400,
letterSpacing: 1.5,
color: Color(0xFFD4A84B),
),
),
],
),
);
}
/// 构建应用标题
Widget _buildAppTitle() {
return const Text(
'榴莲女皇',
style: TextStyle(
fontSize: 32,
fontFamily: 'Noto Sans SC',
fontWeight: FontWeight.w700,
height: 1.25,
letterSpacing: 1.6,
color: Color(0xFF4A3F35), // 深棕色文字
),
);
}
}