3.8 KiB
3.8 KiB
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懒加载。 - 不跑真机,设备侧滚动、布局、分类切换和详情跳转由用户验收。
二、实现方案
- 删除
_continueHeader、_dramaContent、_continueTile、_ShowcaseCard与_cardsFor,首页不再构建或保留「继续观看」文案和代码。 - 将页面滚动容器改为
CustomScrollView,依次放置: carouselSliverToBoxAdapter、分类与标题SliverToBoxAdapter、状态SliverToBoxAdapter或剧目SliverGrid、底部留白SliverToBoxAdapter。 - 剧目网格使用
SliverGridDelegateWithFixedCrossAxisCount:crossAxisCount: 2、crossAxisSpacing: 12、mainAxisSpacing: 16、childAspectRatio: 2 / 3;左右由SliverPadding保持 16。 - 卡片封面使用 2:3 比例、14px 圆角、
RemoteImage和现有底部深色渐变; 标题最多 2 行,类型最多 1 行。点击调用现有logic.openCard(..., embedded, onDramaSelected, onAction)。 - 数据直接使用
CategoryController.visibleDramas;For You使用其全量 去重结果。分类切换后由 ChangeNotifier 驱动 sliver 内容更新。 - 保留
categories.loading首载进度、categories.error重试、noCategoryDramas/noSearchResults空态文案。 - l10n 新增
allDramas:全部剧目/All Dramas/Semua Drama,并重新生成 l10n。
三、影响文件
ReelShort/lib/pages/discover/discover_view.dartReelShort/lib/l10n/app_en.arbReelShort/lib/l10n/app_zh.arbReelShort/lib/l10n/app_id.arbReelShort/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.mdFruitServer/docs/plans/PROGRESS.mdFruitServer/docs/plans/INBOX.md
四、测试与门禁
- 先新增 K9 首页 widget 测试并取得红灯。
- 实现后验证:无「继续观看」、有「全部剧目」、2 列 sliver、左右/行列间距、 2:3 封面、分类切换更新、空态与失败态。
- 运行
dart analyze lib test、flutter test、flutter build apk --debug; 构建前检查无并发flutter run/build。 - 完成后
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 决定。