diff --git a/docs/plans/2026-10-21-K98-auth-keyboard.md b/docs/plans/2026-10-21-K98-auth-keyboard.md new file mode 100644 index 0000000..4f72957 --- /dev/null +++ b/docs/plans/2026-10-21-K98-auth-keyboard.md @@ -0,0 +1,73 @@ +# K98 修复登录与手机号登录键盘遮挡 + +## 目标 + +- 登录/注册页在邮箱或密码框聚焦后,自动滚动到键盘上方。 +- 手机号登录弹窗的手机号/验证码框同样保持可见。 +- Android `adjustNothing` 下通过既有 MethodChannel 获取键盘高度,iOS 使用实时 + `MediaQuery.viewInsets`。 + +## 分支 + +- ReelShort:`fix/k98-auth-keyboard`,从最新 `origin/develop` 创建。 +- FruitServer 仅写计划与 PROGRESS 留痕,不改后端功能代码。 + +## A. 有效键盘高度 + +在 `keyboard_inset.dart` 增加: + +```dart +double effectiveKeyboardInset( + BuildContext context, + KeyboardInsetNotifier notifier, { + double maxRatio = 0.6, +}); +``` + +- 取 MediaQuery viewInsets 与 Android channel 逻辑像素值的最大值。 +- Web/非 Android 不读取 channel。 +- 超过屏幕高度 60% 时按 0 处理,负值/非法值归零。 + +## B. AuthPage + +1. `initState` 启动 `KeyboardInsetNotifier`,监听并用 setState 刷新。 +2. `SingleChildScrollView` 增加 `ScrollController`。 +3. 底部 padding 使用固定底部留白 + effectiveKeyboardInset。 +4. 邮箱/密码 FocusNode 监听焦点;聚焦或键盘高度变化后: + - 通过 FocusNode.context 的 RenderBox 获取字段全局底边。 + - 与屏幕高度 - 键盘高度 - 24 比较。 + - 被遮挡时用 200ms easeOutCubic animateTo 补足滚动。 +5. `resizeToAvoidBottomInset` 保持 false。 + +## C. PhoneAuthSheet + +1. 接入 KeyboardInsetNotifier 和 ScrollController。 +2. 底部 padding 改用 effectiveKeyboardInset。 +3. 手机号/验证码 FocusNode 增加与 AuthPage 相同的焦点/键盘变化滚动校正。 +4. 保持现有 SingleChildScrollView、弹窗和返回键行为。 + +## D. 测试 + +- iOS viewInsets=300:登录密码框、注册密码框均在键盘上方。 +- Android platform + MethodChannel 键盘高度:密码框仍在键盘上方。 +- iOS:手机号弹窗验证码框在键盘上方。 +- 所有平台 override 测试返回前显式恢复 + `debugDefaultTargetPlatformOverride = null`。 + +## 门禁 + +- `dart analyze lib test` +- `flutter test` +- `flutter build apk --debug` + +## Git + +- ReelShort 提交:`fix(auth): 登录注册与手机号登录键盘避让` +- 作者 `Zhou Weidong <502333560@qq.com>`;禁止 `git add -A`。 +- `--no-ff` 合回 `develop` 并 push,两仓库 PROGRESS 留痕。 + +## 约束 + +- 全程中文;不改后端、ReelShortWeb、specs。 +- 不改评论输入框已验证的 Android pinned 策略。 +- 不安装或操作真机;完成后停住等待验收。 diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index 8098290..9e6a41e 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -24328,3 +24328,35 @@ Xcode build done. 44.0s 解读:静态分析零告警,555 项全量测试通过,Android 与 iOS simulator 构建成功; `pubspec.lock` 已还原,无依赖变更,未安装或操作真机。 + +## 2026-10-21 K98 修复登录与手机号登录键盘遮挡 + +- 已完整读取 K98 `docs/plans/INBOX.md`。 +- 已从最新 `origin/develop` 创建 ReelShort `fix/k98-auth-keyboard`。 +- 已先写计划 `docs/plans/2026-10-21-K98-auth-keyboard.md`: + 统一 viewInsets/channel 有效键盘高度,登录/注册和手机号弹窗按字段位置自动滚动。 +- 不改后端、ReelShortWeb、specs;不安装或操作真机。 +- 已新增 `effectiveKeyboardInset`:取 MediaQuery viewInsets 与 Android channel + 逻辑像素最大值,Web/非 Android 忽略 channel,超过屏幕 60% 时归零。 +- 登录/注册页已接入 notifier、ScrollController 和邮箱/密码焦点校正; + 仍保持 `resizeToAvoidBottomInset: false`,遮挡时 200ms easeOutCubic 滚动。 +- 手机号弹窗已使用有效键盘高度,并给手机号/验证码框增加同样的滚动校正。 +- 已补 iOS 登录/注册、Android channel、手机号验证码框键盘避让测试。 + +门禁原始输出: + +```text +$ 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` 已还原,无依赖变更,未安装或操作真机。