Files
FruitServer/docs/plans/2026-10-21-K98-auth-keyboard.md

2.5 KiB
Raw Permalink Blame History

K98 修复登录与手机号登录键盘遮挡

目标

  • 登录/注册页在邮箱或密码框聚焦后,自动滚动到键盘上方。
  • 手机号登录弹窗的手机号/验证码框同样保持可见。
  • Android adjustNothing 下通过既有 MethodChannel 获取键盘高度,iOS 使用实时 MediaQuery.viewInsets。

分支

  • ReelShort:fix/k98-auth-keyboard,从最新 origin/develop 创建。
  • FruitServer 仅写计划与 PROGRESS 留痕,不改后端功能代码。

A. 有效键盘高度

在 keyboard_inset.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 策略。
  • 不安装或操作真机;完成后停住等待验收。