Files

3.8 KiB
Raw Permalink Blame History

2026-10-17 K9 首页剧目列表改造(2 列全部剧目)

一、目标与边界

首页(发现 tab)移除「继续观看」区块,在分类 chips 下方以懒构建的 2 列网格展示 当前分类的全部剧目;保留 header、轮播、分类、三态、空态和底部导航。

  • 客户端分支:feature/flutter-k9-home-grid,基线 develop 99f64ab。
  • 文档分支:docs/k9-home-grid,FruitServer 基线 K9 任务书 b434f65。
  • 只改首页(发现页)、三语 l10n、对应 widget 测试与 docs/plans/。
  • 不改接口、数据模型、CategoryController 过滤逻辑、轮播、通知、观看记录、 收藏、下载或底部导航。
  • 不新增图片、依赖或分页;继续使用 RemoteImage 懒加载。
  • 不跑真机,设备侧滚动、布局、分类切换和详情跳转由用户验收。

二、实现方案

  1. 删除 _continueHeader、_dramaContent、_continueTile、_ShowcaseCard 与 _cardsFor,首页不再构建或保留「继续观看」文案和代码。
  2. 将页面滚动容器改为 CustomScrollView,依次放置: carousel SliverToBoxAdapter、分类与标题 SliverToBoxAdapter、状态 SliverToBoxAdapter 或剧目 SliverGrid、底部留白 SliverToBoxAdapter。
  3. 剧目网格使用 SliverGridDelegateWithFixedCrossAxisCount: crossAxisCount: 2、crossAxisSpacing: 12、mainAxisSpacing: 16、 childAspectRatio: 2 / 3;左右由 SliverPadding 保持 16。
  4. 卡片封面使用 2:3 比例、14px 圆角、RemoteImage 和现有底部深色渐变; 标题最多 2 行,类型最多 1 行。点击调用现有 logic.openCard(..., embedded, onDramaSelected, onAction)。
  5. 数据直接使用 CategoryController.visibleDramas;For You 使用其全量 去重结果。分类切换后由 ChangeNotifier 驱动 sliver 内容更新。
  6. 保留 categories.loading 首载进度、categories.error 重试、 noCategoryDramas / noSearchResults 空态文案。
  7. l10n 新增 allDramas: 全部剧目 / All Dramas / Semua Drama,并重新生成 l10n。

三、影响文件

  • ReelShort/lib/pages/discover/discover_view.dart
  • ReelShort/lib/l10n/app_en.arb
  • ReelShort/lib/l10n/app_zh.arb
  • ReelShort/lib/l10n/app_id.arb
  • ReelShort/lib/l10n/app_localizations*.dart(生成物)
  • ReelShort/test/discover/home_all_dramas_grid_test.dart(新增)
  • ReelShort/test/widget_test.dart(仅更新作废的「继续观看」断言)
  • FruitServer/docs/plans/2026-10-17-K9.md
  • FruitServer/docs/plans/PROGRESS.md
  • FruitServer/docs/plans/INBOX.md

四、测试与门禁

  1. 先新增 K9 首页 widget 测试并取得红灯。
  2. 实现后验证:无「继续观看」、有「全部剧目」、2 列 sliver、左右/行列间距、 2:3 封面、分类切换更新、空态与失败态。
  3. 运行 dart analyze lib test、flutter test、flutter build apk --debug; 构建前检查无并发 flutter run/build。
  4. 完成后 merge --no-ff 回客户端 develop 并 push;FruitServer 文档同样 合并推送。作者与提交者统一为 Zhou Weidong <502333560@qq.com>。

五、风险与待确认

  • 既有 test/widget_test.dart 有两个壳层用例断言首页出现 Continue Watching。K9 明确要求该文案彻底消失,因此原断言与 find.text('Continue Watching'), findsNothing 不可能同时成立。 处理方式:保留两个既有用例及完整导航流程,只把已作废的文案断言更新为 All Dramas,不删除任何测试用例。
  • 首页 feed 可能一次返回较多剧目;必须使用 SliverGrid 懒构建,不能嵌套 GridView(shrinkWrap: true)。
  • 2:3 卡片在小屏需要保持标题 2 行和类型 1 行不溢出;测试覆盖 320px 宽度。
  • 不改 CategoryController 的数据语义;筛选仍由现有分区 code 决定。