feat(splash): 缩短开屏停留并统一开屏图

This commit is contained in:
Zhou Weidong committed 2026-10-23 01:06:07 +08:00
1 parent b513ac0a9c
commit 6318ca24ec
18 files changed
+47 -100

No files matched your search

+1 -80
View File
@@ -30,9 +30,6 @@ import 'home_logic.dart';
import 'widgets/home_feed_grid.dart';
import 'widgets/home_grid_header.dart';
const Duration _startupSplashMinimumDuration = Duration(milliseconds: 400);
const Duration _startupSplashFadeDuration = Duration(milliseconds: 200);
class HomePage extends StatefulWidget {
const HomePage({super.key});
@@ -44,31 +41,15 @@ class _HomePageState extends State<HomePage> with WidgetsBindingObserver {
bool _resumeRetryInFlight = false;
HomeFeedController? _homeFeed;
bool _recommendSeeded = false;
Timer? _startupSplashMinimumTimer;
bool _catalogSettled = false;
bool _startupSplashVisible = true;
bool _startupSplashFadingOut = false;
bool _startupSplashMinimumElapsed = false;
bool _startupSplashDismissing = false;
bool _startupSplashSettledTriggered = false;
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
WidgetsBinding.instance.addPostFrameCallback((_) {
if (!mounted) return;
_startupSplashMinimumTimer = Timer(_startupSplashMinimumDuration, () {
if (!mounted) return;
_startupSplashMinimumElapsed = true;
unawaited(_dismissStartupSplashIfReady());
});
});
}
@override
void dispose() {
_startupSplashMinimumTimer?.cancel();
_homeFeed?.dispose();
WidgetsBinding.instance.removeObserver(this);
super.dispose();
@@ -102,43 +83,12 @@ class _HomePageState extends State<HomePage> with WidgetsBindingObserver {
@override
Widget build(BuildContext context) {
final catalog = context.watch<CatalogController>();
_catalogSettled = catalog.settled;
if (_startupSplashVisible &&
_catalogSettled &&
!_startupSplashSettledTriggered) {
_startupSplashSettledTriggered = true;
WidgetsBinding.instance.addPostFrameCallback((_) {
if (mounted) unawaited(_dismissStartupSplashIfReady());
});
}
return Theme(
data: AppTheme.dark(),
child: Stack(
fit: StackFit.expand,
children: [
_buildHome(context, catalog),
if (_startupSplashVisible)
_StartupSplashOverlay(fadingOut: _startupSplashFadingOut),
],
),
child: _buildHome(context, catalog),
);
}
Future<void> _dismissStartupSplashIfReady() async {
if (!mounted ||
!_startupSplashVisible ||
_startupSplashDismissing ||
!_startupSplashMinimumElapsed ||
!_catalogSettled) {
return;
}
_startupSplashDismissing = true;
setState(() => _startupSplashFadingOut = true);
await Future<void>.delayed(_startupSplashFadeDuration);
if (!mounted) return;
setState(() => _startupSplashVisible = false);
}
Widget _buildHome(BuildContext context, CatalogController catalog) {
final homeFeed = _ensureHomeFeed(catalog);
if (!_recommendSeeded && catalog.dramas.isNotEmpty) {
@@ -162,35 +112,6 @@ class _HomePageState extends State<HomePage> with WidgetsBindingObserver {
}
}
class _StartupSplashOverlay extends StatelessWidget {
const _StartupSplashOverlay({required this.fadingOut});
final bool fadingOut;
@override
Widget build(BuildContext context) {
return IgnorePointer(
child: AnimatedOpacity(
key: const Key('startup-splash'),
opacity: fadingOut ? 0 : 1,
duration: _startupSplashFadeDuration,
curve: Curves.easeOut,
child: ColoredBox(
color: AppColors.appBackground,
child: Center(
child: Image.asset(
'assets/icon/splash_logo.png',
key: const Key('startup-splash-logo'),
width: 240,
fit: BoxFit.contain,
),
),
),
),
);
}
}
/// 四个根页面共享同一路由并保持各自状态。
class _HomeTabs extends StatefulWidget {
const _HomeTabs({super.key, required this.feedController});