65 lines
2.2 KiB
Markdown
65 lines
2.2 KiB
Markdown
# K97 修复 iOS 评论输入弹窗键盘避让
|
||
|
||
## 目标
|
||
|
||
- iOS 评论输入浮层实时跟随 `MediaQuery.viewInsets.bottom`,确保输入框与发表按钮
|
||
位于键盘上方。
|
||
- Android 保留既有 MethodChannel + 80ms 防抖 pinned 策略,不恢复底部 SafeArea,
|
||
避免键盘收起时 48px 抖动回归。
|
||
- 聚焦、`TextInput.show` 兜底和发表成功提示逻辑不变。
|
||
|
||
## 分支
|
||
|
||
- ReelShort:`fix/k97-ios-comment-keyboard`,从最新 `origin/develop` 创建。
|
||
- FruitServer 仅写计划与 PROGRESS 留痕,不改后端功能代码。
|
||
|
||
## A. 平台区分
|
||
|
||
- `_isAndroid = !kIsWeb && defaultTargetPlatform == TargetPlatform.android`。
|
||
- Android:
|
||
- 继续监听 `KeyboardInsetNotifier`。
|
||
- 继续使用 80ms 防抖后的 `_pinnedKeyboardInset`。
|
||
- iOS / 其他平台:
|
||
- 不读取 pinned/channel 值。
|
||
- `build` 中直接读取 `MediaQuery.viewInsetsOf(context).bottom`。
|
||
- inset 超过屏幕高度 60% 时按 0 处理,负值归零。
|
||
|
||
## B. 面板布局
|
||
|
||
- 面板主体使用 `AnimatedPadding`,只设置 bottom:
|
||
- `duration: 160ms`
|
||
- `curve: Curves.easeOutCubic`
|
||
- Android 使用 pinned 值。
|
||
- iOS / 其他平台使用实时 viewInsets。
|
||
- Material 仍铺到屏幕底部,用于键盘收起后的实色填充。
|
||
- Android 不包裹 SafeArea。
|
||
- iOS / 其他平台包裹 `SafeArea(top: false)`,保留 home indicator 底部避让。
|
||
|
||
## C. 测试
|
||
|
||
- iOS + `viewInsets.bottom=300`:
|
||
- 键盘避让 AnimatedPadding 的 bottom 为 300。
|
||
- `comment-composer-post` 底边位于屏幕高度减 300 之上。
|
||
- iOS + `viewInsets=0`:padding 为 0。
|
||
- Android 既有 pinned/channel、焦点、弹出、关闭、发布用例保持通过。
|
||
- 所有平台 override 测试结束恢复
|
||
`debugDefaultTargetPlatformOverride = null`。
|
||
|
||
## 门禁
|
||
|
||
- `dart analyze lib test`
|
||
- `flutter test`
|
||
- `flutter build apk --debug`
|
||
- `flutter build ios --simulator --no-codesign`
|
||
|
||
## Git
|
||
|
||
- ReelShort 提交:`fix(comment): 修复 iOS 评论输入弹窗键盘避让`
|
||
- 作者 `Zhou Weidong <502333560@qq.com>`;禁止 `git add -A`。
|
||
- `--no-ff` 合回 `develop` 并 push,两仓库 PROGRESS 留痕。
|
||
|
||
## 约束
|
||
|
||
- 全程中文;不改后端、ReelShortWeb、specs。
|
||
- 不安装或操作真机;完成后停住等待验收。
|