feat: 开屏后直接展示首页骨架

This commit is contained in:
Zhou Weidong committed 2026-10-22 23:11:03 +08:00
1 parent 56d7abc6b1
commit 5f278a3510
10 files changed
+300 -166

No files matched your search

+45 -8
View File
@@ -8,12 +8,14 @@ import 'package:provider/provider.dart';
import '../../../core/data/models/content_category.dart';
import '../../../core/data/models/drama.dart';
import '../../../core/data/services/auth_controller.dart';
import '../../../core/data/services/catalog_controller.dart';
import '../../../core/data/services/category_controller.dart';
import '../../../core/data/services/home_feed_controller.dart';
import '../../../core/data/services/wallet_controller.dart';
import '../../../core/theme/app_colors.dart';
import '../../../core/theme/app_dimens.dart';
import '../../../core/widgets/app_pull_to_refresh.dart';
import '../../../core/widgets/drama_grid_skeleton.dart';
import '../../../core/widgets/empty_state.dart';
import '../../../core/widgets/paged_list_footer.dart';
import '../../../l10n/app_localizations.dart';
@@ -75,6 +77,7 @@ class _HomeFeedGridState extends State<HomeFeedGrid> {
Widget build(BuildContext context) {
final l10n = AppLocalizations.of(context)!;
final categories = context.watch<CategoryController>().categories;
final catalog = context.watch<CatalogController>();
final auth = context.watch<AuthController>();
final wallet = context.watch<WalletController>();
final shortcuts = _categoryShortcuts(categories, l10n);
@@ -123,6 +126,7 @@ class _HomeFeedGridState extends State<HomeFeedGrid> {
context,
l10n,
tab: HomePrimaryTab.values[index],
catalog: catalog,
shortcuts: shortcuts,
),
),
@@ -154,21 +158,36 @@ class _HomeFeedGridState extends State<HomeFeedGrid> {
BuildContext context,
AppLocalizations l10n, {
required HomePrimaryTab tab,
required CatalogController catalog,
required List<HomeGridCategoryShortcut> shortcuts,
}) {
if (catalog.error != null && widget.feedController.dramas.isEmpty) {
return _catalogErrorState(l10n, catalog);
}
if ((!catalog.settled || catalog.loading) &&
widget.feedController.dramas.isEmpty) {
return const DramaGridSkeleton(
key: Key('home-grid-skeleton'),
columns: 3,
horizontalPadding: AppDimens.feedPageHorizontal,
crossAxisSpacing: AppDimens.homeGridGap,
mainAxisSpacing: AppDimens.homeGridRowGap,
);
}
if (tab == HomePrimaryTab.ranking) {
return const RankingPage(embedded: true);
}
if (widget.feedController.loadingFirstPage) {
return const Center(
child: SizedBox.square(
dimension: 24,
child: CircularProgressIndicator(strokeWidth: 2),
),
);
}
final tag = _selectedTags[tab];
final dramas = _dramasFor(tab, tag, shortcuts);
if (widget.feedController.loadingFirstPage && dramas.isEmpty) {
return const DramaGridSkeleton(
key: Key('home-grid-skeleton'),
columns: 3,
horizontalPadding: AppDimens.feedPageHorizontal,
crossAxisSpacing: AppDimens.homeGridGap,
mainAxisSpacing: AppDimens.homeGridRowGap,
);
}
return LayoutBuilder(
builder: (context, constraints) {
final itemWidth =
@@ -237,6 +256,24 @@ class _HomeFeedGridState extends State<HomeFeedGrid> {
);
}
Widget _catalogErrorState(AppLocalizations l10n, CatalogController catalog) {
final theme = Theme.of(context);
return Theme(
data: theme.copyWith(
colorScheme: theme.colorScheme.copyWith(
onSurface: AppColors.textTertiary,
),
),
child: EmptyState(
key: const Key('home-grid-error'),
icon: Icons.cloud_off_rounded,
title: l10n.catalogError,
actionLabel: l10n.retry,
onAction: catalog.load,
),
);
}
Future<void> _refresh() async {
await widget.feedController.refreshCurrent();
}