From ba628e3a4a0ee1e91a42cc059f4254bc5c93aff6 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Wed, 21 Oct 2026 14:56:56 +0800 Subject: [PATCH] =?UTF-8?q?docs(plans):=20=E8=AE=B0=E5=BD=95=20K86.21=20?= =?UTF-8?q?=E8=AF=84=E8=AE=BA=E8=BE=93=E5=85=A5=E6=B5=AE=E5=B1=82=E7=A8=B3?= =?UTF-8?q?=E5=AE=9A=E5=AE=9A=E4=BD=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...2026-10-21-K86.21-composer-stable-inset.md | 46 +++++++++++++++++++ docs/plans/PROGRESS.md | 24 ++++++++++ 2 files changed, 70 insertions(+) create mode 100644 docs/plans/2026-10-21-K86.21-composer-stable-inset.md diff --git a/docs/plans/2026-10-21-K86.21-composer-stable-inset.md b/docs/plans/2026-10-21-K86.21-composer-stable-inset.md new file mode 100644 index 0000000..5ea83f0 --- /dev/null +++ b/docs/plans/2026-10-21-K86.21-composer-stable-inset.md @@ -0,0 +1,46 @@ +# K86.21 评论输入浮层稳定定位实施计划 + +## 目标 + +修复 Android 收起评论输入键盘时,输入浮层因键盘收起动画中的瞬时 inset 被逐帧 `max` 抬高而向上跳动的问题。评论列表面板、输入内容和关闭规则保持不变。 + +## 根因 + +- `CommentComposerSheet.build` 每次重建都用 `math.max` 累积当前 effective keyboard inset。 +- IME 收起动画期间可能出现高于稳定值的瞬时 inset,累计后永久抬高 `_pinnedKeyboardInset`。 +- 面板布局随后按更高的 pinned 值重新定位,造成输入浮层向上跳一小段。 + +## 范围 + +- ReelShort `lib/pages/player/widgets/comment_composer_sheet.dart` +- ReelShort `test/comment/drama_comments_sheet_test.dart` +- FruitServer `docs/plans/PROGRESS.md` + +## 实现计划 + +1. 移除 `build` 中逐帧更新 `_pinnedKeyboardInset` 的逻辑,新增键盘可见状态和 80ms 稳定捕获 Timer。 +2. effective inset 从 0 变为正数时启动 Timer;Timer 触发时只读取一次当前 inset,并取整后写入 pinned。 +3. 键盘持续可见期间,后续 inset 变大或变小都不更新 pinned;inset 归零只取消 Timer 并重置可见状态,下一次弹起可重新捕获。 +4. pinned 上限为屏幕高度的 60%;非有限值、负值或超过上限的异常值忽略,保证 pinned 不小于 0。 +5. 保持 `Positioned(bottom: 0)`、白色 Material 铺到屏幕底部及 `Padding(bottom: pinned)` 布局,不使用位移或回落动画。 +6. 返回键/IME 下箭头只收键盘;透明外部点击和发表成功仍为关闭入口。 + +## 测试计划 + +- 先新增失败测试:2200 高视口模拟 `0 → 1100(稳定)→ 1150(收起瞬时峰值)→ 600 → 0`,断言 1100 捕获后输入浮层 top、bottom、高度均保持不变。 +- 运行旧实现确认红灯,记录实际偏移。 +- 新实现后运行定向测试、完整评论面板测试文件、`dart analyze lib test` 和全量 `flutter test --no-pub`。 + +## 风险与处理 + +- 80ms 可能早于极慢 IME 动画结束;按任务要求采用固定稳定窗口,不在后续可见阶段继续累计。 +- 超过屏幕 60% 的异常值被忽略后,需等下一次 0 → 正数弹起再捕获,避免错误定位。 +- Timer 在 dispose 时取消,避免 Overlay 关闭后回调访问已卸载 State。 + +## Git + +- ReelShort 从 `develop` 创建 `fix/composer-stable-inset`。 +- 提交:`fix(player): 固定评论输入浮层位置避免收键盘跳动`。 +- 作者:`Zhou Weidong <502333560@qq.com>`。 +- `--no-ff` 合回 `develop` 并 push,不使用 force push,不执行 `git add -A`。 +- FruitServer 追加 PROGRESS 留痕;不安装真机,完成后等待用户验收。 diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index 610728c..c73e351 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -23545,3 +23545,27 @@ $ flutter test --no-pub ``` 解读:ReelShort 静态检查零告警,512 条测试全部通过。未安装真机,等待用户验收。 + +## 2026-10-21 ReelShort:K86.21 评论输入浮层稳定定位 + +- 功能分支:`fix/composer-stable-inset`,从 ReelShort develop `e90217b` 创建。 +- 功能提交:`d2f2459 fix(player): 固定评论输入浮层位置避免收键盘跳动`。 +- develop 合并提交:`036bd29 merge: 合并 K86.21 评论输入浮层稳定定位修复`,已推送 `e90217b..036bd29`。 +- 根因是 `CommentComposerSheet.build` 每帧用 `math.max` 累计 effective keyboard inset;IME 收起动画中的瞬时偏大值会被永久保留并抬高输入浮层。 +- 新增 `_keyboardVisible` 与 80ms `_keyboardSettleTimer`:仅在 inset 从 0 变为正数时启动,Timer 触发时读取一次当前值并取整写入 `_pinnedKeyboardInset`;键盘可见期间后续 inset 变大或变小均不更新 pinned,归零只取消 Timer 并重置可见状态。 +- pinned 上限限制为屏幕高度 60%,非有限值或超过上限的异常值忽略,负值归零;K86.19 的 `Positioned(bottom: 0)`、白色 Material 铺满屏幕底部及内部 `Padding(bottom: pinned)` 布局保持不变。 +- 返回键与 IME 下箭头仍只收键盘,透明外部点击或发表成功才关闭浮层。 +- 新增测试模拟 2200 高视口下 `0 → 1100(稳定)→ 1150(收起瞬时峰值)→ 600 → 0`。旧实现红灯为 expected `984.0`、actual `934.0`,上跳 50px;新实现稳定捕获后 top、bottom、高度均保持不变。 + +门禁原始输出: + +```text +$ dart analyze lib test +Analyzing lib, test... +No issues found! + +$ flutter test --no-pub +01:54 +513: All tests passed! +``` + +解读:ReelShort 静态检查零告警,513 条测试全部通过。未安装真机,等待用户验收。