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