From d4ce3a5d8bff2de2ebf4c4eb783446a83a9d97b0 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 26 Oct 2026 22:49:10 +0800 Subject: [PATCH] =?UTF-8?q?fix(home):=20=E4=BF=AE=E5=A4=8D=E7=9B=AE?= =?UTF-8?q?=E5=BD=95=E9=94=99=E8=AF=AF=E6=80=81=E8=A2=AB=E5=8D=A0=E4=BD=8D?= =?UTF-8?q?=E5=B1=82=E9=81=AE=E6=8C=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/pages/home/widgets/home_feed_grid.dart | 5 +++ test/home/home_startup_splash_test.dart | 43 ++++++++++++++++++++-- 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/lib/pages/home/widgets/home_feed_grid.dart b/lib/pages/home/widgets/home_feed_grid.dart index d35b8ed..3afbc7f 100644 --- a/lib/pages/home/widgets/home_feed_grid.dart +++ b/lib/pages/home/widgets/home_feed_grid.dart @@ -104,6 +104,7 @@ class _HomeFeedGridState extends State { return _categoryPlaceholder( l10n, context.watch(), + catalog, ); } final category = shortcuts[index]; @@ -146,7 +147,11 @@ class _HomeFeedGridState extends State { Widget _categoryPlaceholder( AppLocalizations l10n, CategoryController controller, + CatalogController catalog, ) { + if (catalog.error != null) { + return _catalogErrorState(l10n, catalog); + } if (controller.loading) { return const DramaGridSkeleton( key: Key('home-grid-skeleton'), diff --git a/test/home/home_startup_splash_test.dart b/test/home/home_startup_splash_test.dart index 1119423..caa5296 100644 --- a/test/home/home_startup_splash_test.dart +++ b/test/home/home_startup_splash_test.dart @@ -4,6 +4,7 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:provider/provider.dart'; import 'package:fruitshorts/app.dart'; import 'package:fruitshorts/core/config/app_config.dart'; import 'package:fruitshorts/core/data/models/drama.dart'; @@ -13,6 +14,8 @@ import 'package:fruitshorts/core/data/repositories/catalog_repository.dart'; import 'package:fruitshorts/core/data/repositories/favorite_repository.dart'; import 'package:fruitshorts/core/data/repositories/playback_repository.dart'; import 'package:fruitshorts/core/data/repositories/watch_history_repository.dart'; +import 'package:fruitshorts/core/data/services/catalog_controller.dart'; +import 'package:fruitshorts/core/data/services/category_controller.dart'; import 'package:shared_preferences_platform_interface/in_memory_shared_preferences_async.dart'; import 'package:shared_preferences_platform_interface/shared_preferences_async_platform_interface.dart'; @@ -51,7 +54,11 @@ void main() { expect(find.byType(CircularProgressIndicator), findsNothing); repository.complete(_feed); - await tester.pumpAndSettle(); + await _pumpForAppData(tester); + await _pumpUntilFound( + tester, + find.byKey(const Key('home-feed-card-the-signal-demo')), + ); expect(find.byKey(const Key('startup-splash')), findsNothing); expect(find.byKey(const Key('home-grid-skeleton')), findsNothing); @@ -62,7 +69,8 @@ void main() { tester, ) async { await _pumpApp(tester, _FailingCatalogRepository()); - await tester.pumpAndSettle(); + await _pumpForAppData(tester); + await _pumpUntilFound(tester, find.byKey(const Key('home-grid-error'))); expect(find.byKey(const Key('home-grid-header')), findsOneWidget); expect(find.byKey(const Key('home-grid-error')), findsOneWidget); @@ -72,7 +80,8 @@ void main() { testWidgets('should_show_catalog_empty_state_inside_grid', (tester) async { await _pumpApp(tester, _EmptyCatalogRepository()); - await tester.pumpAndSettle(); + await _pumpForAppData(tester); + await _pumpUntilFound(tester, find.byKey(const Key('home-grid-empty'))); expect(find.byKey(const Key('home-grid-header')), findsOneWidget); expect(find.byKey(const Key('home-grid-empty')), findsOneWidget); @@ -99,6 +108,34 @@ Future _pumpApp(WidgetTester tester, CatalogRepository repository) async { await tester.pump(); } +Future _pumpUntilFound(WidgetTester tester, Finder finder) async { + for (var frame = 0; frame < 40; frame++) { + if (finder.evaluate().isNotEmpty) return; + await tester.pump(const Duration(milliseconds: 16)); + } + await tester.pump(); +} + +Future _pumpForAppData(WidgetTester tester) async { + await tester.runAsync( + () => Future.delayed(Duration.zero), + ); + for (var frame = 0; frame < 40; frame++) { + final root = find.byKey(const Key('home-tabs')); + if (root.evaluate().isNotEmpty) { + final context = tester.element(root); + final catalog = context.read(); + final categories = context.read(); + if (catalog.settled && !catalog.loading && !categories.loading) { + await tester.pump(); + return; + } + } + await tester.pump(const Duration(milliseconds: 16)); + } + await tester.pump(); +} + final _feed = HomeFeed( sections: [ FeedSection(code: 'hot', title: 'Hot', dramas: [demoDramas.first]),