Files
ReelShort/docs/plans/PROGRESS.md
T

53 KiB
Raw Blame History

开发进度

2026-10-21 K96 剧场页服务端分类分页

  • 已完整读取 K96 docs/plans/INBOX.md。
  • 已从最新 origin/develop 创建 ReelShort feat/k96-theater-feed。
  • 计划见 FruitServer docs/plans/2026-10-21-K96-theater-feed.md。
  • 客户端将新增 TheaterFeedController,并让剧场「全部 / 分类」改用 /app/feed 服务端游标分页;不改首页 K94/K95 已交付逻辑。
  • 已完成 CatalogApi.feed / CatalogRepository.fetchFeed 可选 categoryId, 非空才拼请求参数。
  • 已新增 TheaterFeedController:按分类独立缓存,缓存先渲染后静默刷新, 10 秒超时、游标追加去重、失败保留旧数据、失败分类切回自动重试。
  • 剧场页「全部」和分类 chips 已改用 theater feed;滚动剩余不足 400px 触发 loadMore,下拉刷新同时执行 categories 与 theater 刷新,搜索模式保持独立。
  • 已补分类参数、缓存切换、分页去重、hasMore 停止、失败保留、失败重试、 分类点击请求和滚动加载 widget 测试。

门禁原始输出:

$ dart analyze lib test
Analyzing lib, test...
No issues found!

$ flutter test --no-pub
00:52 +553: All tests passed!

$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 24.8s
✓ Built build/app/outputs/flutter-apk/app-debug.apk

解读:静态分析零告警,553 项全量测试通过,debug APK 构建成功; pubspec.lock 已还原,无依赖变更,未安装或操作真机。

2026-10-21 K97 修复 iOS 评论输入弹窗键盘避让

  • 已完整读取 K97 docs/plans/INBOX.md。
  • 已从最新 origin/develop 创建 fix/k97-ios-comment-keyboard。
  • 计划见 FruitServer docs/plans/2026-10-21-K97-ios-comment-keyboard.md。
  • Android 保留既有 pinned/channel 策略;iOS 与其他平台改用实时 MediaQuery.viewInsets.bottom,并补 iOS 键盘避让测试。
  • 已完成 _isAndroid 平台分流;Android 的 channel、80ms 防抖和 pinned 逻辑保持不变, iOS/其他平台直接读取实时 viewInsets,超过屏幕 60% 的异常值按 0 处理。
  • 面板已使用 160ms easeOutCubic AnimatedPadding;Android 不包裹 SafeArea, iOS/其他平台使用 SafeArea(top: false) 处理 home indicator。
  • 已补 iOS insets=300/0 测试,发表按钮在键盘上方;Android pinned 既有用例全部通过。

门禁原始输出:

$ dart analyze lib test
Analyzing lib, test...
No issues found!

$ flutter test --no-pub
00:54 +555: All tests passed!

$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 26.2s
✓ Built build/app/outputs/flutter-apk/app-debug.apk

$ flutter build ios --simulator --no-codesign
Xcode build done. 44.0s
✓ Built build/ios/iphonesimulator/Runner.app

解读:静态分析零告警,555 项全量测试通过,Android 与 iOS simulator 构建成功; pubspec.lock 已还原,无依赖变更,未安装或操作真机。

2026-10-21 K97.1 剧场搜索框圆角改小

  • 已从最新 origin/develop 创建 fix/k97.1-theater-search-radius。
  • 仅将剧场搜索框圆角从 22 调整为 12,高度 44、颜色、聚焦态及 清空/识剧逻辑保持不变,并同步更新对应 widget 断言。

门禁原始输出:

$ dart analyze lib test
Analyzing lib, test...
No issues found!

$ flutter test --no-pub
00:55 +555: All tests passed!

$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 25.8s
✓ Built build/app/outputs/flutter-apk/app-debug.apk

解读:静态分析零告警,555 项全量测试通过,debug APK 构建成功; pubspec.lock 已还原,无依赖变更,未安装或操作真机。

2026-10-21 K98 修复登录与手机号登录键盘遮挡

  • 已完整读取 K98 docs/plans/INBOX.md。
  • 已从最新 origin/develop 创建 fix/k98-auth-keyboard。
  • 计划见 FruitServer docs/plans/2026-10-21-K98-auth-keyboard.md。
  • 将统一 viewInsets/channel 有效键盘高度,并给登录页与手机号弹窗增加 焦点/键盘变化后的字段滚动校正。
  • 已新增 effectiveKeyboardInset,兼容 iOS 实时 viewInsets 与 Android adjustNothing 下的 MethodChannel 键盘高度。
  • 登录/注册页已增加 ScrollController、notifier 监听和邮箱/密码焦点校正; 手机号弹窗已同样接入手机号/验证码框滚动校正。
  • 已补 iOS 登录/注册、Android channel、手机号验证码框键盘避让测试。

门禁原始输出:

$ dart analyze lib test
Analyzing lib, test...
No issues found!

$ flutter test --no-pub
00:52 +559: All tests passed!

$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 26.2s
✓ Built build/app/outputs/flutter-apk/app-debug.apk

解读:静态分析零告警,559 项全量测试通过,debug APK 构建成功; pubspec.lock 已还原,无依赖变更,未安装或操作真机。

2026-10-21 K98.1 收藏与观看记录直接进入播放页

  • 已从最新 origin/develop 创建 fix/k98.1-play-from-lists。
  • 收藏卡片已改为调用 playDramaFromCatalog,不再进入详情页。
  • 观看记录卡片已按 progress.episodeId 直达播放页对应集;episodeId 为空时从第 1 集起播。
  • 详情未加载完成的观看记录仍保持原禁用、加载和重试行为。
  • 已补收藏及观看记录直达 PlayerPage 的路由断言。

门禁原始输出:

$ dart analyze lib test
Analyzing lib, test...
No issues found!

$ flutter test --no-pub
01:09 +561: All tests passed!

$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 28.7s
✓ Built build/app/outputs/flutter-apk/app-debug.apk

解读:静态分析零告警,561 项全量测试通过,debug APK 构建成功; pubspec.lock 已还原,无依赖变更,未安装或操作真机。

2026-10-21 K98.2 修复 feed 更新触发 build 期通知

  • 已从最新 origin/develop 创建 fix/k98.2-feed-build-notify。
  • PlayerPage 的 feed 更新改为帧后调度,同一帧多次变化继续由 PlayerLogic 合并。
  • PlayerLogic 在非 idle 调度阶段延后 feed 通知与 PageController 跳页,并给延迟通知去重。
  • HomeLogic.onDramaChanged 在 build/layout/paint 阶段改为帧后通知。
  • 已补 build 阶段 updateFeed、最终 PageController 位置及 HomeLogic 延后通知回归测试。

门禁原始输出:

$ dart analyze lib test
Analyzing lib, test...
No issues found!

$ flutter test --no-pub
00:55 +563: All tests passed!

$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 26.4s
✓ Built build/app/outputs/flutter-apk/app-debug.apk

解读:静态分析零告警,563 项全量测试通过,debug APK 构建成功; pubspec.lock 已还原,无依赖变更,未安装或操作真机。

2026-10-21 K98.3 修复频道切换复用已释放视频控制器

  • 已从最新 origin/develop 创建 fix/k98.3-disposed-video-controller。
  • PlaybackSession.active 与 preparedPlayerAt 不再暴露 closed/retiring slot; _retire 先清空活动引用并通知,再等待界面帧边界后暂停和释放播放器。
  • PlayerLogic._replaceSession 切换 session 后等待 endOfFrame,并再次校验 revision 后才关闭旧 session;其它 session 回收路径同样使用该帧边界。
  • 已补 retiring player 脱钩单测,以及真实 PlayerVideoSurface 经 feed 切换、 连续 pump 后不出现 disposed controller 异常的回归测试。

门禁原始输出:

$ dart analyze lib test
Analyzing lib, test...
No issues found!

$ flutter test --no-pub
00:58 +565: All tests passed!

$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 35.7s
✓ Built build/app/outputs/flutter-apk/app-debug.apk

解读:静态分析零告警,565 项全量测试通过,debug APK 构建成功; pubspec.lock 已还原,无依赖变更,未安装或操作真机。

2026-10-22 登录异常改为屏幕居中弹窗

  • 已从 origin/develop(9b78e43)创建 feature/login-error-center-dialog。
  • 新增 lib/core/widgets/centered_error_dialog.dart,统一居中样式、遮罩关闭、确认按钮。
  • 邮箱登录/注册与手机号 OTP/验证码异常改为居中弹窗;字段校验保持内联,成功提示不变。
  • 新增 authLoginFailed / authRegisterFailed / authErrorConfirm 三语言文案并重新生成 l10n。
  • 异常弹窗前提交 busy 已复位,避免 loading 卡在弹窗打开期间。

执行命令与原始输出:

$ flutter gen-l10n
Because l10n.yaml exists, the options defined there will be used instead.
To use the command line arguments, delete the l10n.yaml file in the Flutter project.

$ flutter test --no-pub test/auth/auth_page_test.dart test/auth/phone_auth_sheet_test.dart
00:02 +20: All tests passed!

$ dart analyze lib test
Analyzing lib, test...
No issues found!

$ flutter test --no-pub
00:49 +570: All tests passed!

解读:登录异常、注册标题、未知异常回退、本地校验不弹窗、遮罩/按钮关闭和手机号两条 异常路径均通过;全量静态分析零告警,570 项测试全过。pubspec.lock 已还原, 未启停服务,未操作真机。

2026-10-22 登录异常调整为中心吐司

  • 已从 develop(11e37a9)创建 feature/login-error-center-toast。
  • 删除 AlertDialog 组件,新增 OverlayEntry 居中吐司:淡入淡出、约 2 秒消失、不拦截手势。
  • 吐司保持全局单例,新消息替换旧消息;邮箱与手机号异常路径均已切换。
  • 本地表单校验继续内联,手机号验证码发送成功 SnackBar 保持不变。
  • 清理 authLoginFailed / authRegisterFailed / authErrorConfirm 并重新生成 l10n。

执行命令与原始输出:

$ flutter gen-l10n
Because l10n.yaml exists, the options defined there will be used instead.
To use the command line arguments, delete the l10n.yaml file in the Flutter project.

$ flutter test --no-pub test/core/centered_toast_test.dart
00:00 +3: All tests passed!

$ flutter test --no-pub test/auth/auth_page_test.dart test/auth/phone_auth_sheet_test.dart
00:02 +20: All tests passed!

$ dart analyze lib test
Analyzing lib, test...
No issues found!

$ flutter test --no-pub
01:00 +573: All tests passed!

解读:吐司单例替换、点击穿透和自动消失通过;认证异常与本地校验路径通过; 全量静态分析零告警,573 项测试全过。pubspec.lock 已还原,未启停服务, 未操作真机。

2026-10-22 播放器 loading 与锁定进度条调整

  • 已从 develop(7b068e8)创建 feature/player-loading-polish。
  • 播放器票据与 session loading 圈统一为 24×24、线宽 2。
  • loading 高光默认改为白色,普通轨道色与首页 white24 轨道保持不变。
  • 首页和全屏播放器进度条增加 locked 状态;锁定态显示静态 inactive 线,不进入 loading, 禁用拖动与 seek。
  • 已补 loading 指示器尺寸、缓冲高光颜色、首页/全屏锁定态和锁定轨道高度测试。

执行命令与原始输出:

$ flutter test --no-pub test/player/loading_progress_track_test.dart test/playback/seek_progress_bar_test.dart
00:00 +8: All tests passed!

$ flutter test --no-pub test/home/home_preview_layout_test.dart
00:01 +7: All tests passed!

$ flutter test --no-pub test/player/player_fullscreen_test.dart
00:09 +37: All tests passed!

$ dart analyze lib test
Analyzing lib, test...
No issues found!

$ flutter test --no-pub
00:50 +576: All tests passed!

解读:加载高光、锁定静态轨道、拖动禁用和两个 loading 指示器尺寸均通过; 全量静态分析零告警,576 项测试全过。pubspec.lock 已还原,未启停服务, 未操作真机。

2026-10-22 屏幕常亮与前台自动续播

  • 已从 develop(5bf1022)创建 feature/keep-awake-auto-resume。
  • Android 主 Activity 添加 FLAG_KEEP_SCREEN_ON,保留已有渠道、PiP 和键盘逻辑。
  • iOS AppDelegate 开启 isIdleTimerDisabled,前台保持常亮。
  • 用户主动暂停后回前台安全恢复;过期票据先完成重取再设置播放意图。
  • locked、blocked、票据错误、会话错误、解锁/浮层遮挡和 PiP 场景不会强制续播。
  • 后台仍立即保存进度并暂停,不做后台播放。

执行命令与原始输出:

$ flutter test --no-pub test/player/player_logic_test.dart
00:00 +35: All tests passed!

$ dart analyze lib test
Analyzing lib, test...
No issues found!

$ flutter test --no-pub
00:50 +580: All tests passed!

解读:用户暂停恢复、过期票据重取、locked/ticketError/浮层阻断及后台保存暂停 均通过;全量静态分析零告警,580 项测试全过。pubspec.lock 已还原, 未启停服务,未操作真机。

2026-10-22 播放位置连续性

  • 已从 develop(fe49c6d)创建 feature/playback-position-continuity。
  • 新增 PlaybackPositionCache,按 episodeId 保存 dramaId、position、duration、updatedAt。
  • App Provider 注入单一缓存实例,PlayerLogic 与详情页共享。
  • 进度监听、保存进度与进入详情前更新缓存;loadResumePoint 优先缓存,未命中再回源。
  • 详情页继续观看与 CTA 优先使用最近缓存集,返回首页保持当前播放器位置。
  • 跨剧缓存不命中;片尾保护继续复用 clampResumePosition。

执行命令与原始输出:

$ flutter test --no-pub test/playback/playback_position_cache_test.dart
00:00 +4: All tests passed!

$ flutter test --no-pub test/player/player_logic_test.dart
00:00 +38: All tests passed!

$ flutter test --no-pub test/player/player_open_detail_test.dart
00:00 +1: All tests passed!

$ dart analyze lib test
Analyzing lib, test...
No issues found!

$ flutter test --no-pub
00:53 +589: All tests passed!

解读:缓存读写/过期、跨剧隔离、缓存命中去网络、服务端回落、详情 CTA 缓存集 和详情往返同秒位置均通过;全量静态分析零告警,589 项测试全过。 pubspec.lock 已还原,未启停服务,未操作真机。

2026-10-22 Seek 后播放位置保持

  • 已从 develop(47ca214)创建 feature/playback-seek-position。
  • 新增播放位置 clamp;缓存、上报与详情返回统一使用 seek 完成后的 controller 位置。
  • PlayerLogic 增加 pending seek 屏障,saveCurrentProgress 与离开路径会等待 seek 和写入完成。
  • 监听器统一读取一次当前播放快照,避免旧位置覆盖新位置。
  • 已补 seek 目标缓存、越界 clamp、seek 后立即进详情并返回的位置测试。

执行命令与原始输出:

$ flutter test --no-pub test/playback/playback_position_cache_test.dart
00:00 +5: All tests passed!

$ flutter test --no-pub test/player/player_logic_test.dart --plain-name should_cache_actual_position_after_seek_completes
00:00 +1: All tests passed!

$ flutter test --no-pub test/player/player_open_detail_test.dart
00:00 +1: All tests passed!

$ dart analyze lib test
Analyzing lib, test...
No issues found!

$ flutter test --no-pub
00:49 +591: All tests passed!

解读:seek 完成后缓存与上报使用实际位置,越界目标被 clamp;seek 后立即 进详情并返回仍保持目标位置。全量静态分析零告警,591 项测试全过。 pubspec.lock 已还原,未启停服务,未操作真机。

2026-10-22 播放入口无缓冲提示

  • 已从 Seek 修复合并后的 develop(f302b39)创建 feature/playback-entry-no-buffer。
  • 未初始化进度条改为静态 inactive 轨道,不显示流动高光且不可拖动。
  • 仅 initialized 且 isBuffering 持续超过 350ms 时显示白色缓冲高光。
  • PlayerView 删除 session 居中 loading,只保留 ticket loading。
  • preparePlayer 改为初始化完成后先 seek 缓存位置再 play;详情返回复用原 controller。

执行命令与原始输出:

$ flutter test --no-pub test/playback/seek_progress_bar_test.dart
00:00 +7: All tests passed!

$ flutter test --no-pub test/home/home_preview_layout_test.dart
00:01 +8: All tests passed!

$ flutter test --no-pub test/player/player_logic_test.dart
00:00 +40: All tests passed!

$ flutter test --no-pub test/player/player_fullscreen_test.dart
00:09 +37: All tests passed!

$ dart analyze lib test
Analyzing lib, test...
No issues found!

$ flutter test --no-pub
00:49 +593: All tests passed!

解读:短缓冲不闪、持续缓冲仍显示白色高光;未初始化/入口/返回/重建路径 均无多余 loading,重建顺序为 initialize→seek→play。全量静态分析零告警, 593 项测试全过。pubspec.lock 已还原,未启停服务,未操作真机。

2026-10-22 播放器进度拖动画面预览

  • 已从最新 develop(d06dce9)创建 feature/scrub-frame-preview。
  • 计划文档:docs/plans/2026-10-22-scrub-frame-preview.md。
  • 性能红线:拖动期间主线程无卡顿;原生并发取帧不超过 1;预览图最大宽 240px;Dart LRU 缓存不超过 24 帧;不新增 pub 依赖;不改后端契约。
  • 实施顺序:缩略图服务与缓存 -> 预览卡片及两处进度条 -> Android/iOS 原生渠道 -> 单测/widget 测试与全量门禁。
$ git status --short --branch
## feature/scrub-frame-preview

$ git log -5 --oneline --decorate
d06dce9 (HEAD -> feature/scrub-frame-preview, origin/develop, develop) merge: 合并播放入口无缓冲提示

解读:工作树从最新 develop 创建且开工前无未提交改动。当前仅新增计划与 PROGRESS 留痕,后续每完成一个阶段会补充命令原始输出与解读。

实现结果

  • 新增 PlaybackThumbnailService:1 秒 bucket、24 帧 LRU、单飞合流、 最新 bucket 优先、停顿 120ms 后最多预取相邻 1 帧、1.5 秒统一回落。
  • 新增 ScrubPreviewCard:120dp 宽、圆角 8、白色 1px 描边,显示 当前时间 / 总时长,安全边距内跟随拖动点;帧到达前始终显示封面。
  • 首页 feed 与全屏播放器进度条均接入;松手立即隐藏并取消尚未开始的请求。
  • Android 使用单线程 MediaMetadataRetriever,iOS 使用串行 AVAssetImageGenerator;两端优先本地路径、最大宽 240px、JPEG 约 70、 失败或 1.5 秒超时回调 null。
  • 未新增 pub 依赖,未改后端契约;pubspec.lock 已还原,未启停服务, 未操作真机。

执行命令与原始输出:

$ flutter test --no-pub test/playback/playback_thumbnail_service_test.dart test/playback/seek_progress_bar_test.dart test/home/home_preview_layout_test.dart
00:01 +28: All tests passed!

$ dart analyze lib test
Analyzing lib, test...
No issues found!

$ flutter test --no-pub
00:56 +606: All tests passed!

解读:bucket、24 帧 LRU、同 bucket 合流、过期请求丢弃、松手取消、 120ms 预取防覆盖、异常/超时回落、首页与全屏预览卡片、封面占位和松手立即 消失均通过;全量静态分析零告警,606 项测试全过。性能红线保持:主线程不做 图片解码/取帧、原生并发 1、预览最大宽 240px、缓存最多 24 帧、不增依赖、 不改后端。原生取帧真实画面与设备性能由 PM 真机验收。

2026-10-22 雪碧图 VTT 拖动预览

  • 已从 develop(89a94f8)创建 feature/sprite-scrub-preview。
  • 计划文档:docs/plans/2026-10-22-sprite-scrub-preview.md。
  • 性能红线:拖动帧不发起网络/解码,只做 cue 二分与 sourceRect 绘制; VTT 缓存 10 分钟且只解析一次;sprite ui.Image 最多 2 张;超过 2048px 按比例缩放;签名地址不进入持久化缓存。
  • 回退链:雪碧图 -> 现有本地原生取帧 -> 集封面。
$ git status --short --branch
## feature/sprite-scrub-preview

$ git rev-parse --short HEAD
89a94f8

解读:工作树从指定最新 develop 创建,开工前无未提交改动;主工作区现有 pubspec.lock 未复制、未修改。

实现结果

  • Episode / PlayTicket 增加 nullable thumbnailsUrl;票据写回和详情来源都保留, 本地下载只覆盖视频地址,不丢 VTT;签名地址未进入持久化缓存。
  • 新增 SpriteThumbnailAxisService:Dio VTT 拉取、10 分钟缓存、403 清缓存重试一次、 cue 解析与二分、sprite ui.Image LRU2、2048px 解码上限。
  • PlayerPage 在选中集就绪时预取当前及相邻 sprite;dispose 释放 VTT 与图片。
  • ScrubPreviewCard 优先用 CustomPaint.drawImageRect 绘制 sourceRect; VTT 未就绪显示封面,轴为空/加载失败回退本地原生取帧,再失败保留封面。
  • 拖动帧只做缓存查询、二分、矩形裁剪与 drawImageRect,不发起网络或图片解码。

执行命令与原始输出:

$ flutter test --no-pub test/playback/sprite_thumbnail_axis_test.dart test/player/scrub_preview_card_test.dart
00:00 +11: All tests passed!

$ flutter test --no-pub test/playback/seek_progress_bar_test.dart test/home/home_preview_layout_test.dart test/player/player_fullscreen_test.dart
00:10 +55: All tests passed!

$ dart analyze lib test
Analyzing lib, test...
No issues found!

$ flutter test --no-pub
00:54 +617: All tests passed!

解读:VTT 时间/xywh/多 sprite、越界最近 cue、LRU2、403 重试、10 分钟 TTL、 回退链、sprite 零本地取帧、无 URL 本地回退和最终封面兜底均通过;全量静态分析 零告警,617 项测试全过。pubspec.lock 已还原,未启停服务,未操作真机。

2026-10-22 Android Studio 调试 HTTP 日志

  • 分支:feature/debug-http-logging
  • 基线:develop / origin/develop = dc4b602
  • 计划:docs/plans/2026-10-22-debug-http-logging.md
$ git status --short --branch
## develop...origin/develop
 M pubspec.lock

$ git rev-parse HEAD
dc4b60270dd38d594510b45bd7a3d50b7dcd2602

解读:基于最新 develop 创建功能分支;开工时 pubspec.lock 已有未提交改动, 本次未修改、未暂存该文件。

实现结果

  • 新增 NetworkLogInterceptor,默认 debugPrint,可注入 void Function(String) 作为单测日志收集器。
  • enabled 常量与 kDebugMode 同时为真才输出,release/profile 零 HTTP 日志。
  • 请求行包含完整 URL 与 query,同时输出耗时起点、脱敏请求头和格式化请求体。
  • Authorization 仅保留前 8 字符后加 ...;X-Device-Id 原样输出; 其余请求头值统一 ***。
  • ResponseType.bytes 响应统一 utf8.decode(..., allowMalformed: true), JSON 自动缩进;图片/音视频/字体/PDF/ZIP 等只输出 MIME 与字节数。
  • 请求体和响应体超过 3000 字符时截断并追加 …(truncated)。
  • 拦截链为 AuthHeaderInterceptor → EnvelopeInterceptor → NetworkLogInterceptor。 Envelope 在解包前暂存原始 bytes,末尾日志读取暂存值,因此仍能打印 Envelope 处理前的原始响应。
  • 异常路径输出 [HTTP] ✗ DioException类型 耗时ms URL message,并继续 handler.next(err),不吞异常。

代表性原始日志:

[HTTP] → POST http://logging.test/app/logging?keyword=%E4%B8%AD%E6%96%87
[HTTP] → 耗时起点:2026-10-22T12:12:25.377357
[HTTP] → headers:{"Accept":"***","Authorization":"Bearer e...","X-Device-Id":"device-raw-001"}
[HTTP] → body:{
  "filter": "中文"
}
[HTTP] ← 200 12ms POST http://logging.test/app/logging?keyword=%E4%B8%AD%E6%96%87
[HTTP] ← body:{
  "code": 0,
  "message": "ok",
  "data": {
    "title": "中文标题"
  }
}

门禁

$ flutter test --no-pub test/core/data/remote/network_log_interceptor_test.dart
00:00 +0: should_log_request_and_response_lines_with_elapsed_when_requested
00:00 +1: should_truncate_long_body_when_log_exceeds_limit
00:00 +2: should_log_plain_text_without_throwing_when_response_is_not_json
00:00 +3: should_log_byte_count_only_when_response_is_image
00:00 +4: should_log_dio_exception_type_and_message_when_request_fails
00:00 +5: All tests passed!

$ dart analyze lib test
Analyzing lib, test...
No issues found!

$ flutter test --no-pub
00:58 +622: All tests passed!

解读:请求/响应行与耗时、Authorization 脱敏、X-Device-Id 原样、bytes 中文 UTF-8 解码、3000 字符截断、非 JSON、二进制字节数、DioException 类型与 message 均通过;全量静态分析零告警,622 项测试全过。

未新增依赖、未启停服务、未操作真机;pubspec.lock 既有改动未提交。

2026-10-22 收藏与观看历史分页 UI

  • 分支:feature/library-paging-ui
  • 基线:develop / origin/develop = 63d3b0f
  • 后端依赖:FruitServer 7b69493(收藏/观看历史 PageResult 与展示字段)
  • 计划:docs/plans/2026-10-22-library-paging-ui.md

实现

  • 新增通用 PageResult<T>;LibraryApi.favorites 与 WatchApi.recent 统一请求 pageIndex/pageSize 并返回 PageResult。
  • 收藏与观看仓储、Controller 增加首屏、刷新、loadMore、total、hasMore、 loadingMore 和 loadMoreError;请求代次避免旧刷新/旧分页覆盖新列表。
  • 收藏按 dramaId 去重,观看按 dramaId 去重;空页或 loaded >= total 停止请求。
  • 收藏页、观看历史页接入滚动触底加载、下拉刷新、通用分页 footer、总数展示。
  • 观看卡片优先展示分页接口的 dramaTitle/dramaCover/episodeNumber; 标题为空时显示本地化“第 N 集”,封面缺失时显示占位图标。
  • API 严格解析服务端 PageResult;旧 List 不做客户端全量包装,由后端部署新契约解决。
  • MineLogic 改用分页首屏 list,不再调用旧 limit 接口。

门禁

定向测试:

$ flutter test --no-pub test/library/library_api_test.dart test/library/favorite_controller_test.dart test/library/favorites_page_test.dart test/watch/watch_api_test.dart test/watch/watch_records_controller_test.dart test/watch/watch_records_page_test.dart test/mine/mine_logic_test.dart
00:03 +40: All tests passed!

完整门禁:

$ dart analyze lib test
Analyzing lib, test...
No issues found!

$ flutter test --no-pub
00:56 +632: All tests passed!

解读:分页第一页、追加去重、无更多不重复请求、loadMore 失败重试、 观看标题/集号/封面展示及空标题兜底均通过;全量静态分析零告警,632 项测试全过。

未新增依赖、未启停服务、未操作真机;现有 pubspec.lock 改动未提交。

范围修订:观看标题优先与按需详情

  • 分页协议、Repository 与 Controller 分页状态保持不变。
  • _hydrate 只对 dramaTitle 为空的记录补拉详情;后端已有标题时不再请求详情。
  • 有标题的记录点击播放时才调用 detailForOpen 按需加载详情,避免列表阶段 N+1。
  • 标题仍为空时使用本地化“第 N 集”,封面缺失继续显示占位。
  • 移除了旧 List 自动包装为 PageResult 的前端全量兜底,避免掩盖后端契约问题。

真实后端分页取证(仅测试账号写入,不启停服务):

GET /app/watch/recent?pageIndex=1&pageSize=1
{"shape":"list","length":2,"dramaIds":["1","5"]}
GET /app/watch/recent?pageIndex=2&pageSize=1
{"shape":"list","length":2,"dramaIds":["1","5"]}
GET /app/favorites?pageIndex=1&pageSize=1
{"shape":"list","length":2,"dramaIds":["1","5"]}
GET /app/favorites?pageIndex=2&pageSize=1
{"shape":"list","length":2,"dramaIds":["1","5"]}

解读:当前 8081 运行实例仍是旧包,返回 List 且忽略 pageIndex/pageSize;第 1/2 页 均返回相同两条数据。客户端不做全量兜底;live smoke 检测到旧 List 后明确标记 skipped, 等待后端新包部署后再执行分页真实联调。

门禁:

$ flutter test --no-pub test/integration/live_watch_flow_test.dart test/library/library_api_test.dart test/watch/watch_api_test.dart test/watch/watch_records_controller_test.dart test/watch/watch_records_page_test.dart
00:02 +22 ~1: All tests passed!

$ dart analyze lib test
Analyzing lib, test...
No issues found!

$ flutter test --no-pub
00:52 +630 ~1: All tests passed!

解读:有 dramaTitle 时不触发详情请求、点击时才加载详情、空标题兜底、 第 2 页追加去重和 hasMore 行为均通过;全量分析零告警,630 项通过、1 项旧服务 能力探测跳过。pubspec.lock 既有改动未提交。

2026-10-22 收藏卡片简介

  • 分支:feature/favorite-card-synopsis
  • 基线:develop / origin/develop = 9093700
  • 计划:docs/plans/2026-10-22-favorite-card-synopsis.md

实现

  • _FavoriteCard 在标题/标签下方条件渲染 drama.synopsis.trim()。
  • 简介最多 2 行、TextOverflow.ellipsis,使用 AppColors.muted、12 号字和 1.15 行高,由 Flexible 占据剩余空间,保持封面与卡片原高度。
  • 简介为空或纯空白时不创建文本节点,继续使用原 Spacer,不占高度。
  • 未改接口、后端和收藏分页逻辑。

门禁

$ flutter test --no-pub test/library/favorites_page_test.dart
00:01 +7: All tests passed!

$ dart analyze lib test
Analyzing lib, test...
No issues found!

$ flutter test --no-pub
00:51 +631 ~1: All tests passed!

解读:有简介时文本最多 2 行并省略,空简介不渲染且卡片高度与正常卡片一致; 全量静态分析零告警,631 项通过、1 项运行中旧后端能力探测跳过。 pubspec.lock 既有改动未提交。

2026-10-22 ReelShort 客户端深色视觉改造

  • 分支:feature/dark-theme-client
  • 基线:开发前已有约 43 个未提交视觉文件,本次在原改动上继续收敛,未推倒重来。
  • 计划:docs/plans/2026-10-22-dark-theme-client.md

颜色与主题

  • AppTheme.dark() 成为默认且唯一主题,系统状态栏/导航栏图标统一浅色。
  • 色板统一为背景 #0B1020、卡片 #151B2E、浮层 #1C2436、 divider #0FFFFFFF、主色 #FF6B2C、辅助链接色 #22D3EE。
  • 主/次/禁用文字分别使用白色 92% / 64% / 38%。
  • 卡片/按钮/输入框/标签圆角统一为 12/10/10/6,卡片阴影关闭。
  • 页面和组件内的 Colors.*、Color(0x...) 已全部映射到 AppColors 语义 token;剩余原始色值只在 app_colors.dart 中定义。
  • 导航、玻璃面板、播放器遮罩、加载轨道、渐变、边框和阴影均改为深色语义。
  • 修正全局输入装饰 padding 导致账户性别下拉溢出,保持原布局宽度。

验证命令与原始结果

$ git checkout -- pubspec.lock
$ git status --short --branch
## feature/dark-theme-client

$ rg -n -P "Color\(0x|(?<!App)Colors\." lib | rg -v '^lib/core/theme/'
(no output)

$ rg -n "SystemUiOverlayStyle\.dark" lib
(no output)

解读:pubspec.lock 漂移已还原;页面/组件层不再直接写颜色,所有状态栏均使用浅色图标。

$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test --no-pub
00:51 +644: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
    2,058ms
✓ Built build/app/outputs/flutter-apk/app-debug.apk

解读:静态分析零告警,644 项测试全部通过,debug APK 构建成功;测试与构建后再次确认 pubspec.lock 无改动,未启停服务、未操作真机。

2026-10-22 客户端底部导航改为首页/推荐/追剧/我的

  • 分支:feature/client-bottom-nav-4tabs
  • 基线:develop / origin/develop = ec3cb8f
  • 计划:docs/plans/2026-10-22-client-bottom-nav-4tabs.md
  • 实现提交:91e869d feat(nav): 底部导航改为首页推荐追剧我的

问题

根导航仍为首页/剧场/创作/我的,底栏选中态使用品牌橙。追剧若通过新路由打开, 会叠加第二层底栏并产生返回栈,不符合参考图和单根导航交互。

改动

  • 新增 AppRootTab 统一四个 tab 的顺序、key、图标和 l10n 标签。
  • AppBottomNav 改为纯黑底、白色选中、#8A8A8E 未选中,图标 24、文字 11, 保留 SafeArea 与轻震动。
  • 首页 IndexedStack 第三槽直接使用 FavoritesContent,不再 push 收藏路由。 追剧保留顶部标题区、隐藏返回按钮,只有一个根底栏,不创建嵌套 Scaffold。
  • FavoritesPage 保留独立 Scaffold 和返回行为,继续供“我的”入口使用。
  • 推荐、追剧、我的三个根页面统一调用 HomeLogic.select 切换,不进入返回栈。
  • 创作页保留,mine-creator-center 入口保留;创作不再出现在根底栏。
  • 中文使用“追剧”,英文使用 Home / Recommend / Following / My, 印尼语使用 Beranda / Rekomendasi / Daftar Tonton / Saya。
  • FavoritesContent 内置顶部 SafeArea,避免嵌入首页后被状态栏遮挡。

门禁命令与原始输出

$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test --no-pub
04:38 +644: All tests passed!

导航测试覆盖:四个 tab 数量与顺序、纯白/灰色状态、点击追剧进入 FavoritesContent、仅一个 AppBottomNav、追剧内部无嵌套 Scaffold、 Navigator.canPop == false、创作不再出现在底栏且我的入口保留。

解读:静态分析零告警,644 项测试全部通过;追剧与首页/推荐/我的均在同一根页面 内切换,无叠加导航或返回栈。pubspec.lock 未提交,未启动或停止服务,未操作真机。

2026-10-22 根导航布局规格对齐

  • 分支:feature/client-bottom-nav-layout
  • 基线:develop / origin/develop = 667fdc5
  • 实现提交:81787dc style(nav): 对齐四 Tab 底栏布局规格

改动

  • 新增 AppRootBottomNav 作为首页、推荐、追剧、我的唯一根导航入口, 三个 Shell 页面不再各自拼装 item。
  • 四列使用 Expanded 等分,图标在上、文字在下,间距 4。
  • 内容高度 56,另由 SafeArea 增加底部安全区;图标 26、文字 11、 letterSpacing = 0,选中 w600、未选中 w400。
  • 背景纯黑,取消顶部边框;选中 #FFFFFF,未选中 #8E8E93。
  • 首页、推荐、书签、人像继续使用各自的选中实心/未选中描边图标。

门禁命令与原始输出

$ flutter analyze
Analyzing reelshort-bottom-nav...
No issues found! (ran in 5.2s)
$ flutter test
04:43 +645: All tests passed!

解读:四等分、56 内容高度、安全区、26 图标、4 间距、精确色值和无分割线 均有测试覆盖;645 项测试全部通过。pubspec.lock 未提交,未操作真机。

2026-10-22 首页改为三列探索网格

  • 分支:feature/home-grid-layout
  • 基线:develop / origin/develop = 6dea9d4
  • 实现提交:dd96792 feat(home): 首页改为三列探索网格

布局与数据

  • 首页按参考图改为纯黑探索页:搜索框、皇冠、礼物入口、一级分类、 二级标签与三列封面网格。
  • HomeFeedController 继续使用 10 条游标分页;支持下拉刷新、触底加载、 空态与失败重试,没有全量拉取。
  • 一级固定项为精选/新剧/分类/榜单;古装/社群仅在 /app/categories 名称匹配时显示。新剧/分类/榜单复用现有页面。
  • 二级标签按分类与题材可用性显示,筛选按钮复用 FilterPage。
  • 卡片封面 5:6、圆角 8、间距 8;包含真实热剧/新剧/漫剧角标、 播放量、最多两行标题与最多两个题材标签。
  • Drama 增加 dramaType 和可选 createdAt;卡片未下发上架时间时 从 Snowflake id 解析,不使用假数据。
  • 原 PlayerPage(homeMode: true) 保留并迁至推荐 tab,播放器文件与测试未删除。
  • 首页顶部中性色、卡片与描边 token 已沉淀到 AppColors/AppDimens, 后续 P14 复用。

门禁命令与原始输出

$ flutter analyze
Analyzing reelshort-bottom-nav...
No issues found! (ran in 2.7s)
$ flutter test
02:32 +651: All tests passed!

解读:三列网格、分类顺序、动态入口隐藏、角标、卡片信息、分页大小、 下一页追加和卡片进入播放器均有测试覆盖。home_view.dart 为 478 行, 其余新增组件均低于 500 行。pubspec.lock 未提交,未操作真机。

2026-10-22 「我的」页视觉风格统一

  • 分支:feature/mine-visual-style
  • 基线:develop / origin/develop = 47bf645
  • 实现提交:83129ac feat(mine): 统一我的页深色视觉风格

Token 与改动

  • 复用 P11 的 appBackground/contentCard/contentSurface/contentBorder, 新增 textPrimary/mineCardRadius/mineRowHeight/minePageTitle/mineSectionTitle。
  • 页面底色改为纯黑,移除「我的」页的旧深蓝渐变;页头白色标题 21/w700。
  • 头像、三宫格、金币卡、会员卡、菜单统一为深灰 16 圆角、1px 极淡描边, 无阴影、无渐变、无发光。
  • 主文字/昵称/金额使用 #FFFFFF,次级说明和 chevron 使用 #8E8E93。
  • 三宫格等宽,入口图标 24 线性;菜单行高 52、标题 15,分割线只存在行间。
  • 橙色仅保留在充值、加入 VIP 等主操作;头像与菜单图标不再使用粉色/橙色装饰。
  • 区块顺序、全部入口、跳转与交互逻辑保持不变。

门禁命令与原始输出

$ flutter analyze
Analyzing reelshort-bottom-nav...
No issues found!
$ flutter test
00:56 +651: All tests passed!

解读:背景、卡片 token、圆角/描边、无渐变阴影、三宫格等宽、菜单 52 行高、 入口保留和收藏页跳转均有测试覆盖。pubspec.lock 未提交,未操作真机。

2026-10-22 推荐页沉浸流 / 剧单 / 全部短剧

  • 分支:feature/recommend-section-feed、feature/recommend-tab-feed-correction
  • 修正基线:develop / origin/develop = af6b9bb

固定顶部三 tab 为推荐 / 剧单 / 全部短剧,右侧保留搜索。推荐 tab 直接内嵌 PlayerPage(homeMode: true, embedded: true),支持一屏一剧、上下滑切换、 收藏/点赞/选集/简介/进度条等现有播放器能力;播放器内部频道标题条关闭, 只保留视频与浮层。剧单 tab 包含本週爆款推薦、本週精選新劇、古裝神劇大賞 三条横滑卡片,数据分别本地按播放量、上架时间和古装分类/题材排序过滤。 全部短剧提供四行可用筛选 chips、三列首页同款卡片和 20 条触底分页; 无后端字段的本地/地区/字幕/配音筛选项不展示。根底栏始终保留四个入口。

$ flutter analyze
Analyzing reelshort-recommend-correction...
No issues found! (ran in 3.2s)

$ flutter test
01:03 +644: All tests passed!

解读:沉浸式推荐播放器、剧单三分区横滑、四行筛选、三列网格、tab 状态保留、 搜索、卡片播放、播放器路由覆盖/恢复均有测试覆盖;所有生效文件低于 500 行。 pubspec.lock 未提交,未操作真机。

2026-10-22 追剧页三 tab 与双列网格

  • 分支:feature/following-tabs-grid
  • 基线:develop / origin/develop = 73380ee

页面与数据

  • 根导航追剧槽位改为内嵌 FollowingPage,不再 push 收藏路由,也不叠加 第二层底部导航。
  • 页面提供追剧 / 播放历史 / 预约三个子 tab,使用 IndexedStack 保留各自 滚动位置;切换 tab 会退出编辑态。
  • 追剧复用 FavoriteController,显示“第 N 集 / 共 M 集”,支持下拉刷新、 触底分页、加载/错误/无更多状态。
  • 播放历史复用 WatchRecordsController,优先使用分页接口的 dramaTitle/dramaCover/episodeNumber,仅在标题缺失时补取详情;卡片展示 已看集数与可用进度条,同样支持刷新和分页。
  • 双列网格使用共享卡片:3:4 封面、播放量胶囊、两行标题、副信息与编辑态 减号。删除前二次确认,最后一条移除后自动退出编辑态。
  • 预约没有独立分页数据源,本轮保留真实空态;未登录沿用 AuthGatePanel。

门禁命令与原始输出

$ flutter analyze
Analyzing reelshort-bottom-nav...
No issues found! (ran in 1.9s)
$ flutter test
01:12 +643: All tests passed!

解读:三 tab、双列网格、后端历史元数据直出、编辑删除确认、最后一条自动 退出编辑、未登录与空态均有测试覆盖;following_page.dart 低于 500 行。 pubspec.lock 未提交,未操作真机。

2026-10-22 「我的」页布局重排与迷你播放器

  • 分支:feature/mine-layout-redesign
  • 基线:develop / origin/develop = 5aa8170
  • 实现提交:cbc6d80 feat(mine): 重排我的页并新增迷你播放器

页面与入口

  • 用户区改为 56 圆形头像、20/w700 昵称与 13 灰色 UID;UID 支持复制, 未登录显示 Visitor 与登录按钮,已登录显示编辑按钮。
  • VIP 改为金色渐变通栏卡,品牌文案走 l10n,右侧开通按钮复用现有 VIP 页。
  • 删除收藏/历史/下载三宫格;单列菜单固定为钱包、离线缓存、播放历史、 观看偏好、联系客服、语言、设置,行高 56、图标 22、仅行间显示分割线。
  • 收藏由底部追剧 tab 承载;历史、下载、钱包、偏好、客服、语言、设置均 复用现有页面。我的作品、创作者中心与通知保留在登录后的编辑操作面板, 设置页中的通知入口继续可用。
  • 我的页 token 收敛到 AppColors/AppDimens:背景纯黑、卡片 #16161A、 16 圆角、极淡描边、金色渐变仅用于 VIP。
  • 左下角迷你播放器为 96x132,直接使用观看历史首条数据,展示封面、剧名和 集号;无记录或关闭后不占位,点击按记录集号进入全屏播放器。
  • 删除三宫格对应的 localViewer/watchlist 废弃 l10n key 与旧组件代码。

门禁命令与原始输出

$ flutter analyze
Analyzing reelshort-mine-redesign...
No issues found! (ran in 2.1s)
$ flutter test
01:01 +647: All tests passed!

解读:用户区、UID、登录/编辑、VIP、7 项菜单顺序与跳转、旧入口可达性、 迷你播放器显隐/关闭/开播及无数据不渲染均有测试覆盖。mine_view.dart 与新增子组件均低于 500 行;pubspec.lock 未提交,未操作真机。

2026-10-22 全局移除两侧悬浮元素

  • 分支:feature/remove-floating-overlays
  • 基线:develop / origin/develop = 5cead7c

改动

  • 保留首页顶部礼物入口的 home-wallet-badge 红色余额角标。
  • 删除「我的」页 MineMiniPlayer 文件、渲染分支及最近观看开播逻辑。
  • 删除仅为迷你播放器新增的 mineMini* 尺寸 token;没有新增专属 l10n key。
  • 首页、推荐、剧单、全部短剧和追剧页均不渲染两侧游戏/活动悬浮球、 悬浮关闭按钮或迷你播放器。
  • 卡片角标、播放量、标题、标签和顶部钱包红标保持不变。

门禁命令与原始输出

$ flutter analyze
Analyzing reelshort-home-floating...
No issues found! (ran in 2.5s)
$ flutter test
01:32 +647: All tests passed!

解读:登录且钱包快照存在时钱包红标仍显示;首页四个 tab、推荐三个子 tab、 追剧页和我的页均断言不存在两侧悬浮组件。pubspec.lock 未提交, 未操作真机。

2026-10-22 首页与短剧列表视觉字号对齐

  • 分支:feature/visual-type-scale
  • 基线:develop / origin/develop = d03dcf1

Token 与组件

  • 新增 textTertiary = #9E9E9E,以及搜索、页签、筛选 chip、分区标题、 卡片标题/播放量/标签/角标、封面比例和网格间距的公共 token。
  • 搜索框统一为高 40、圆角 8、placeholder 13;一级分类 16,选中 白字 w700,未选中 #9E9E9E w400;二级标签 13 并采用参考图选中/未选中 底色。
  • 三列首页网格与全部短剧网格统一左右边距 14、列间距 6、行间距 18; 封面 5:6、圆角 6。
  • 首页、剧单横滑、追剧双列卡片统一标题 15/w500/1.3、播放量 11 白字、 标签 11/高 18/左右 6,封面到标题 8、标题到标签 6。
  • 剧单分区标题 17/w700,副标题 11 #8E8E93,更多 12 #8E8E93; 分区间距保持 24。
  • 全部短剧筛选 chip 统一高 30、圆角 15、字号 13;我的页标题 17, 追剧顶部页签 16。

门禁命令与原始输出

$ flutter analyze
Analyzing reelshort-visual-type...
No issues found! (ran in 1.8s)
$ flutter test
00:57 +648: All tests passed!

解读:首页搜索/页签/二级标签、三类卡片字体与标签、5:6 封面、网格间距、 筛选 chip、我的标题和追剧双列 320 宽度适配均有测试覆盖。目标组件均低于 500 行;pubspec.lock 未提交,未操作真机。

2026-10-22 首页布局对齐修正

  • 一级分类未选 18/w400、选中 20/w700;二级 chips 间距 10、左右 8、15/w600,并以稳定 AnimatedContainer 切换。
  • 首页内容区改为横向 PageView:点击与滑动共用 PageController,各 tab 保留纵向滚动位置。
  • PageController 与各 tab ScrollController 改为字段直接初始化,修复热重载后的 LateInitializationError。
  • 四类卡片去底板/描边,封面统一 3:4、8 圆角、行距 10、封底标题间距 6;状态角标为右上角紧凑异形丝带。
  • 标题下方恢复左对齐题材文字,使用 | 分隔、灰色小字,与封面状态角标保持独立。
  • 首页搜索栏到一级、一级到二级、二级到网格间距为 8/8/10;非精选 tab 直接以 10 衔接网格。
  • 搜索框右侧皇冠与礼物使用 28 图片图标,缺图时回退原彩色 Icon;透明热区、间距和角标不变。
  • 皇冠/礼物 144×144 透明 PNG 已归档到 assets/icon/,组件路径与资源注册一致。
  • 两张图标已按统一 104/144 内容高重新归一化,28×28 渲染时视觉高度一致。
  • 第二轮素材按 100/144 内容高更新,入口改为 30×30、间距 6,礼物角标继续对齐右上角。
  • 播放量贴封面右下角(底 2、右 6),火焰图标 11 + 12/w400 纯文字,间距 4,并保留极淡底部渐变。
  • 修复二级 chip 运行时颜色误用 const TextStyle 的编译错误,并校正相关测试 Finder 类型。
  • 全部短剧的地区、字幕、配音筛选 UI 已占位;以下接口待补:地区、字幕/配音筛选数据。

2026-10-22 短剧列表刷新体验优化

  • 公共下拉刷新统一为白指示器、40 displacement、Bouncing + AlwaysScrollable,并在下拉期间屏蔽内容点击与滚动条。
  • 首页移除父级 feed 监听,网格、剧单和全部短剧改为局部监听,刷新时保留旧数据及原滚动位置。
  • 剧单、全部短剧、追剧沿用相同刷新策略;首帧加载与刷新指示器分离。
  • 按当前流程未执行 analyze/test。

2026-10-22 ChangeNotifier 监听生命周期排查

  • 全仓核对手动 add/remove;首页、推荐和追剧改为内容区单实例 ListenableBuilder,避免重复订阅。
  • 播放器进度监听改为具名回调,在切换、重建会话和 dispose 时解绑;评论输入弹窗补 controller 更换迁移。
  • _onFeedChanged 已无源码调用链,报错来源为热重载前注册的旧 tear-off;需完全关闭 App 后冷启动。
  • 按当前流程未执行 analyze/test。

2026-10-22 二级标签筛选按钮右对齐

  • 三横线热区由 44 宽改为 26×26,消除 44 宽居中盒造成的视觉右边距偏移。
  • 标签滚动区与按钮间距改为 6,按钮右边缘固定对齐页面 14 边距。
  • 补充按钮尺寸与屏幕右边距断言;按当前流程未执行 analyze/test。

2026-10-22 首页导航图标调整

  • AppRootTab.home 未选中改为 theaters_outlined,选中改为 theaters。
  • 其余三个根导航图标、26 尺寸及白/灰颜色规则保持不变;测试断言同步。
  • 按当前流程未执行 analyze/test。

2026-10-22 首页圆形胶片盘图标

  • AppRootTab 新增可选 assetPath,首页使用 assets/icon/film_reel.png。
  • 共享导航通过 ColorFiltered + Image.asset 按选中态着色,尺寸保持 26,缺图回退胶片 Material 图标。
  • 推荐、追剧、我的图标不变;素材与测试断言同步,按当前流程未执行 analyze/test。

2026-10-22 首页选中态实心摄影机

  • AppRootTab 新增 selectedAssetPath,首页选中使用 film_reel_filled.png,未选中使用描边版。
  • 共享导航保持 ColorFiltered(srcIn) 与 26×26,缺图按选中态回退实心/描边胶片图标。
  • 推荐、追剧、我的不变;测试断言同步,按当前流程未执行 analyze/test。

2026-10-22 底部导航图标与文字加大

  • 公共 token 调整为图标 30、文字 13、图标文字间距 5、内容高度 62。
  • 图片首页图标同步使用 30×30;SafeArea 仍在内容区外独立追加,四等分布局不变。
  • 尺寸测试断言同步,按当前流程未执行 analyze/test。

2026-10-22 推荐页沉浸式布局对齐

  • 推荐/剧单/全部短剧顶部改为视频内居中浮层,17 字号、无下划线,搜索固定右侧 14。
  • 右侧保留收藏/点赞/选集,白色 32 图标、28 间距;评论、分享入口已从该浮层移除。
  • 底部信息重构为标题、真实热度、剧名、题材/集数、可展开简介与渐变观看全集按钮。
  • 新增三语“观看全集”文案;按当前流程未执行 analyze/test。
  • 榜单行支持可选排名:有名次显示 TOPn·热播榜,无名次回退“热播榜”;热度值改用 w 格式。
  • 题材改为空格分隔,集数固定右侧单行;右侧操作栏改为距屏幕边缘 8,底部位置不变。

2026-10-22 推荐页底部信息二次修正

  • 按最新反馈移除整行榜单与热度胶囊,信息顺序收敛为标题、剧名、标签、简介、观看全集。
  • 剧名 19/w600,箭头 20 白色并紧邻剧名;标签行改为 13/w600 亮灰内联布局。
  • 简介「展开/收起」沿用现有三语文案;进度条热区恢复 24 并接入拖动自动清屏与预览卡片。
  • 拖动仅控制视频浮层内容,顶部导航与根底栏保持常驻。
  • 进度条固定中心并动画到 6 高,命中高度 32,时间气泡限制在左右 12;end/cancel/pointer 兜底均恢复拖动前状态。
  • 修复 scrubCancelRequest 误置于 initState 的编译错误,并清理推荐页未使用变量;flutter analyze 无问题。
  • 观看全集按钮相对进度条上移 8,间距调整为 20;按钮改为屏幕宽度 70% 左对齐,flutter analyze 无问题。

2026-10-22 进度条按下与拖动彻底修复

  • Slider 不再在 onChangeStart 清屏;首次真实移动后才进入 scrub,轨道 2/6、thumb 6/8。
  • 推荐流拖动使用独立 opaque 手势与 pointer 兜底,end/cancel 同时恢复浮层和轨道。
  • 推荐浮层改为 AnimatedOpacity + IgnorePointer,进度条节点始终留在树中;scrub setState 均加 mounted 守卫。
  • flutter test test/player/seek_scrub_visibility_test.dart:6 项测试全部通过。

2026-10-22 推荐页播放跳转修正

  • 标题、剧名行和观看全集统一通过 playDramaFromCatalog 打开非 homeMode 逐集播放页。
  • 仅含集数的剧集标题不再显示在标题上方,集数只保留下方进度文案。
  • flutter analyze:No issues found。

2026-10-22 推荐页横向切换

  • 推荐、剧单、全部短剧改为共享 PageController 的横向 PageView,点击与滑动均驱动同一选中态。
  • 三页使用 AutomaticKeepAliveClientMixin 保留视频、滚动位置和筛选状态;顶部导航固定在外层。
  • flutter analyze:No issues found。

2026-10-22 全部短剧布局重排

  • 四行筛选统一 28 高、8 行距、24 项目间距;选中 chip 改为 #4A1E1E、白字 13/w600、圆角 14。
  • 最热/最新改为纯文字选中态,三横线筛选固定在右端;网格改为左右 12、列距 6、行距 12。
  • 第三行筛选完整展示,卡片继续复用首页组件;flutter analyze:No issues found。
  • 筛选项字号提升到 15、圆角 15;筛选区移出滚动容器并固定吸顶,下拉刷新仅作用于网格。
  • 四行首项文字统一到同一 x;行高 30、行距 6、项目距 12,第 4 行保持弹性空白后固定筛选图标。
  • 按最新截图改为 16sp、32 高、10 行距、16 项距;选中态为 #21090E 底配 #FF4D6A 粉字。
  • 第 4 行复用选中胶囊样式,右侧改为 44×44 圆形深灰按钮和 22 三横线图标;flutter analyze 无问题。
  • 筛选行距收紧到 6、项距 10,chip 左右 padding 12;四行均可横向回弹滑动。
  • 第 4 行仅最热/最新在滚动区内,44 圆形筛选按钮固定在滚动区外;flutter analyze 无问题。
  • 四行统一复用 _filterRow 构建,筛选区仅保留一层左右 12 padding。
  • 新增量化测试断言四行首项 x 均为 12、相邻 chip 间距均为 10;flutter analyze 无问题。
  • 修复横向 viewport 对短内容居中:滚动内容最小宽度撑满视口后由 Row.start 排列。
  • flutter test test/recommend/all_dramas_filter_alignment_test.dart:1 项测试通过。

2026-10-22 首页二级标签移除筛选按钮

  • 首页二级标签行改为纯横向滑动,右侧三横线按钮不渲染也不占位。
  • 删除不再使用的筛选回调、尺寸 token、颜色和 CustomPainter;全部短剧页筛选按钮保持不变。
  • flutter analyze:No issues found。
  • 按后续更正恢复首页透明三横线按钮(26、无背景、#7A7A7E),删除全部短剧第 4 行圆形按钮及回调链路。

2026-10-22 追剧页三列改造

  • 追剧页移除预约 tab,改为追剧/播放历史双页横向切换,并保留各自滚动位置。
  • 追剧与历史统一三列卡片,新增固定加号卡片,历史进度与编辑删除能力保留。
  • 按最新口径调整列距 6、行距 12、封面圆角 6;flutter analyze:No issues found。