diff --git a/docs/plans/2026-10-17-K9.md b/docs/plans/2026-10-17-K9.md new file mode 100644 index 0000000..3f303b1 --- /dev/null +++ b/docs/plans/2026-10-17-K9.md @@ -0,0 +1,70 @@ +# 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 决定。