feat: 调整品牌开屏与纯黑原生启动
This commit is contained in:
1 parent
7804809d83
commit
25d90e1383
27 files changed
+88
-14
No files matched your search
@@ -30,6 +30,9 @@ 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});
|
||||
|
||||
@@ -41,15 +44,31 @@ 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();
|
||||
@@ -83,7 +102,41 @@ class _HomePageState extends State<HomePage> with WidgetsBindingObserver {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final catalog = context.watch<CatalogController>();
|
||||
return Theme(data: AppTheme.dark(), child: _buildHome(context, catalog));
|
||||
_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),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
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) {
|
||||
@@ -109,6 +162,35 @@ 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});
|
||||
|
||||
Reference in new issue
Block a user