From 0c06a6dccdb3e3b7c9e4dced8b972f0a6bce258a Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Thu, 22 Oct 2026 19:46:44 +0800 Subject: [PATCH] =?UTF-8?q?fix(recommend):=20=E4=BF=AE=E6=AD=A3=E7=83=AD?= =?UTF-8?q?=E6=92=AD=E4=BF=A1=E6=81=AF=E8=A1=8C=E4=B8=8E=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=E6=A0=8F=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/PROGRESS.md | 2 ++ lib/l10n/app_en.arb | 3 +++ lib/l10n/app_id.arb | 3 +++ lib/l10n/app_localizations.dart | 12 ++++++++++++ lib/l10n/app_localizations_en.dart | 8 ++++++++ lib/l10n/app_localizations_id.dart | 8 ++++++++ lib/l10n/app_localizations_zh.dart | 8 ++++++++ lib/l10n/app_zh.arb | 3 +++ lib/pages/player/widgets/home_feed_overlay.dart | 7 ++++++- .../widgets/home_feed_recommend_panel.dart | 13 ++++++++++--- test/home/home_preview_layout_test.dart | 16 +++++++++++++++- 11 files changed, 78 insertions(+), 5 deletions(-) diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index 5d7d531..b98bd9f 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -1175,3 +1175,5 @@ $ flutter test - 右侧保留收藏/点赞/选集,白色 32 图标、28 间距;评论、分享入口已从该浮层移除。 - 底部信息重构为标题、真实热度、剧名、题材/集数、可展开简介与渐变观看全集按钮。 - 新增三语“观看全集”文案;按当前流程未执行 analyze/test。 +- 榜单行支持可选排名:有名次显示 `TOPn·热播榜`,无名次回退“热播榜”;热度值改用 `w` 格式。 +- 题材改为空格分隔,集数固定右侧单行;右侧操作栏改为距屏幕边缘 8,底部位置不变。 diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index f5b44c3..a19e4ac 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -749,5 +749,8 @@ "watchedToEpisode": "Watched to Episode {episode}", "@watchedToEpisode": { "placeholders": { "episode": { "type": "int" } } }, "homeWatchAll": "Watch all", + "hotChartLabel": "Trending", + "hotChartRanked": "TOP{rank} · Trending", + "@hotChartRanked": { "placeholders": { "rank": { "type": "int" } } }, "confirmRemove": "Remove this item?" } diff --git a/lib/l10n/app_id.arb b/lib/l10n/app_id.arb index 025c1e8..185ecbe 100644 --- a/lib/l10n/app_id.arb +++ b/lib/l10n/app_id.arb @@ -706,5 +706,8 @@ "watchedToEpisode": "Ditonton hingga Episode {episode}", "@watchedToEpisode": { "placeholders": { "episode": { "type": "int" } } }, "homeWatchAll": "Tonton semua", + "hotChartLabel": "Peringkat populer", + "hotChartRanked": "TOP{rank} · Populer", + "@hotChartRanked": { "placeholders": { "rank": { "type": "int" } } }, "confirmRemove": "Hapus item ini?" } diff --git a/lib/l10n/app_localizations.dart b/lib/l10n/app_localizations.dart index 2b3ae8a..e610f00 100644 --- a/lib/l10n/app_localizations.dart +++ b/lib/l10n/app_localizations.dart @@ -3262,6 +3262,18 @@ abstract class AppLocalizations { /// **'Watch all'** String get homeWatchAll; + /// No description provided for @hotChartLabel. + /// + /// In en, this message translates to: + /// **'Trending'** + String get hotChartLabel; + + /// No description provided for @hotChartRanked. + /// + /// In en, this message translates to: + /// **'TOP{rank} · Trending'** + String hotChartRanked(int rank); + /// No description provided for @confirmRemove. /// /// In en, this message translates to: diff --git a/lib/l10n/app_localizations_en.dart b/lib/l10n/app_localizations_en.dart index ef3ebad..1d25160 100644 --- a/lib/l10n/app_localizations_en.dart +++ b/lib/l10n/app_localizations_en.dart @@ -1702,6 +1702,14 @@ class AppLocalizationsEn extends AppLocalizations { @override String get homeWatchAll => 'Watch all'; + @override + String get hotChartLabel => 'Trending'; + + @override + String hotChartRanked(int rank) { + return 'TOP$rank · Trending'; + } + @override String get confirmRemove => 'Remove this item?'; } diff --git a/lib/l10n/app_localizations_id.dart b/lib/l10n/app_localizations_id.dart index f76ec32..e807c46 100644 --- a/lib/l10n/app_localizations_id.dart +++ b/lib/l10n/app_localizations_id.dart @@ -1704,6 +1704,14 @@ class AppLocalizationsId extends AppLocalizations { @override String get homeWatchAll => 'Tonton semua'; + @override + String get hotChartLabel => 'Peringkat populer'; + + @override + String hotChartRanked(int rank) { + return 'TOP$rank · Populer'; + } + @override String get confirmRemove => 'Hapus item ini?'; } diff --git a/lib/l10n/app_localizations_zh.dart b/lib/l10n/app_localizations_zh.dart index b99bb6e..ffba839 100644 --- a/lib/l10n/app_localizations_zh.dart +++ b/lib/l10n/app_localizations_zh.dart @@ -1678,6 +1678,14 @@ class AppLocalizationsZh extends AppLocalizations { @override String get homeWatchAll => '观看全集'; + @override + String get hotChartLabel => '热播榜'; + + @override + String hotChartRanked(int rank) { + return 'TOP$rank·热播榜'; + } + @override String get confirmRemove => '确定移除这条内容吗?'; } diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index e98372e..795c67b 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -668,5 +668,8 @@ "watchedToEpisode": "已看至 第 {episode} 集", "@watchedToEpisode": { "placeholders": { "episode": { "type": "int" } } }, "homeWatchAll": "观看全集", + "hotChartLabel": "热播榜", + "hotChartRanked": "TOP{rank}·热播榜", + "@hotChartRanked": { "placeholders": { "rank": { "type": "int" } } }, "confirmRemove": "确定移除这条内容吗?" } diff --git a/lib/pages/player/widgets/home_feed_overlay.dart b/lib/pages/player/widgets/home_feed_overlay.dart index 9ebfa79..92b000e 100644 --- a/lib/pages/player/widgets/home_feed_overlay.dart +++ b/lib/pages/player/widgets/home_feed_overlay.dart @@ -21,6 +21,7 @@ part 'home_feed_overlay_parts.dart'; const double _progressHeight = 2; const double _progressHitHeight = 12; const double _pageHorizontal = 14; +const double _railRight = 8; const double _railGap = 12; const double _railBottomOffset = 60; const List _boostTextShadows = [ @@ -53,6 +54,7 @@ class HomeFeedOverlay extends StatefulWidget { required this.onMore, this.likeCount, this.favoriteCount, + this.rankingRank, this.commentCount, this.authorNote = '', this.onScrubStart, @@ -69,6 +71,7 @@ class HomeFeedOverlay extends StatefulWidget { final bool liked; final int? likeCount; final int? favoriteCount; + final int? rankingRank; final int? commentCount; final bool saved; final String authorNote; @@ -123,7 +126,7 @@ class _HomeFeedOverlayState extends State { else if (widget.visible) Positioned( left: _pageHorizontal, - right: _pageHorizontal, + right: _railRight, bottom: 12, child: Row( crossAxisAlignment: CrossAxisAlignment.end, @@ -200,6 +203,7 @@ class _HomeFeedOverlayState extends State { Widget _rail() { return HomeFeedActionRail( + key: const Key('home-feed-action-rail'), saved: widget.saved, liked: widget.liked, favoriteCount: widget.favoriteCount, @@ -216,6 +220,7 @@ class _HomeFeedOverlayState extends State { episode: widget.episode, onDetail: widget.onDetail, onOpenFullPlayer: widget.onOpenFullPlayer, + rankingRank: widget.rankingRank, ); } } diff --git a/lib/pages/player/widgets/home_feed_recommend_panel.dart b/lib/pages/player/widgets/home_feed_recommend_panel.dart index 5d681e6..1fd69b3 100644 --- a/lib/pages/player/widgets/home_feed_recommend_panel.dart +++ b/lib/pages/player/widgets/home_feed_recommend_panel.dart @@ -30,12 +30,14 @@ class HomeFeedInfoPanel extends StatefulWidget { required this.episode, required this.onDetail, required this.onOpenFullPlayer, + this.rankingRank, }); final Drama drama; final Episode episode; final VoidCallback onDetail; final VoidCallback onOpenFullPlayer; + final int? rankingRank; @override State createState() => _HomeFeedInfoPanelState(); @@ -119,6 +121,7 @@ class _HomeFeedInfoPanelState extends State { Widget _metaPills(AppLocalizations l10n) { final hot = isHotDrama(widget.drama); final views = widget.drama.viewCount; + final rank = widget.rankingRank; if (!hot && views <= 0) return const SizedBox.shrink(); return Wrap( key: const Key('home-feed-meta-pills'), @@ -139,7 +142,9 @@ class _HomeFeedInfoPanelState extends State { ), const SizedBox(width: 2), Text( - l10n.rankingHot, + rank != null && rank > 0 + ? l10n.hotChartRanked(rank) + : l10n.hotChartLabel, style: const TextStyle( color: AppColors.textPrimary, fontSize: _metaFont, @@ -154,7 +159,7 @@ class _HomeFeedInfoPanelState extends State { key: const Key('home-feed-view-pill'), background: AppColors.overlaySoft, child: Text( - formatInteractionCount(views), + formatPlayCount(views), style: const TextStyle( color: AppColors.textPrimary, fontSize: _metaFont, @@ -209,7 +214,7 @@ class _HomeFeedInfoPanelState extends State { ], Expanded( child: Text( - genres.join(' | '), + genres.join(' '), maxLines: 1, overflow: TextOverflow.ellipsis, style: const TextStyle( @@ -225,6 +230,8 @@ class _HomeFeedInfoPanelState extends State { widget.drama.episodeCount, ), key: const Key('home-feed-episode-progress'), + maxLines: 1, + softWrap: false, style: const TextStyle( color: AppColors.overlaySecondary, fontSize: _metaFont, diff --git a/test/home/home_preview_layout_test.dart b/test/home/home_preview_layout_test.dart index f198ff7..a34c27d 100644 --- a/test/home/home_preview_layout_test.dart +++ b/test/home/home_preview_layout_test.dart @@ -371,9 +371,16 @@ void main() { .data, 'Episode 2 / 8 total', ); - expect(find.textContaining('41.9万'), findsOneWidget); + expect(find.textContaining('41.9w'), findsOneWidget); expect(find.byKey(const Key('home-feed-ranking-pill')), findsOneWidget); expect(find.byKey(const Key('home-feed-view-pill')), findsOneWidget); + expect(find.text('Trending'), findsOneWidget); + expect(find.text('Romance Urban'), findsOneWidget); + final episodeProgress = tester.widget( + find.byKey(const Key('home-feed-episode-progress')), + ); + expect(episodeProgress.maxLines, 1); + expect(episodeProgress.softWrap, isFalse); expect( tester.widget(find.byKey(const Key('rail-like-count'))).data, '1006', @@ -407,6 +414,13 @@ void main() { expect(find.byKey(const Key('rail-comments')), findsNothing); expect(find.byKey(const Key('rail-share')), findsNothing); expect(find.text('Comments'), findsNothing); + expect( + tester.getRect(find.byKey(const Key('home-feed-action-rail'))).right, + closeTo( + tester.getRect(find.byKey(const Key('home-feed-gesture'))).right - 8, + 0.1, + ), + ); expect(find.byKey(const Key('progress-loading')), findsNothing); expect( find.byKey(const Key('home-feed-progress-inactive')),