Skip to content

fix: android 在 input 上按下并移动,会导致键盘下落#2522

Open
shulandmimi wants to merge 1 commit into
masterfrom
fix-android-input-touch
Open

fix: android 在 input 上按下并移动,会导致键盘下落#2522
shulandmimi wants to merge 1 commit into
masterfrom
fix-android-input-touch

Conversation

@shulandmimi

Copy link
Copy Markdown
Collaborator

claude CR

代码评审 — fix-android-input-touch(工作区改动)

▎ 说明:gh 未认证,无法拉取远程 PR,所以我评审的是本地未提交的 diff。当前分支领先 master 0 个提交,只有 mpx-input.tsx 里一行未暂存的改动。

这个改动做了什么

  onTouchStart,
  onTouchEnd,
+ onTouchMove: onTouchEnd,

把 input 已有的 onTouchEnd 处理函数同时挂到了 onTouchMove 上。这个处理函数只做一件事:

const onTouchEnd = (evt) => { evt.nativeEvent.origin = 'input' }

这个标记会被父级 KeyboardAvoidingView 读取(mpx-keyboard-avoiding-view.tsx:67):touch-end 时,除非 nativeEvent.origin === 'input',否则就收起键盘。所以这个修复的意图是:当点击 input 时手指有轻微滑动(这在 Android 上非常常见 —— 对应分支名 fix-android-input-touch),仍然把这次触摸标记为来自 input,从而避免键盘被误收起。

评估 —— 正确、低风险

- 功能安全。 复用的处理函数只设置一个标记,没有副作用、不触发任何 binding,也没有 preventDefault/阻止冒泡,因此不会影响滚动或手势处理。onTouchMove 之前未绑定,所以不会覆盖任何东西。
- 没有过期的构建产物。 dist/mpx-input.jsx 未被 git 跟踪(属于构建输出),所以这个 PR 不需要重新生成编译文件。
- 不会覆盖用户绑定。 mpx-input 没有向使用方暴露 bindtouchmove/bindtouchend,所以新增这个内部处理函数不会屏蔽任何东西。
- 不需要平台判断。 这个行为在 iOS 上也是期望的(在 input 上拖动也不应收起键盘),所以保持无条件绑定、而不是用 isAndroid 限制,是更合理的。
- 性能可忽略。 onTouchMove 在拖动时触发频繁,但函数体只是一次属性赋值。

改进建议

1. 把 onTouchEnd 复用为 move 处理函数是个可维护性隐患(核心问题)。 现在命名“名不副实”—— 一个 move 事件却跑的是 end 处理逻辑。如果以后有人往 onTouchEnd 里加真正只属于 end 的逻辑(比如 bindtouchend 事件、blur、埋点),它会在每一帧 move 里被静默触发。建议把意图抽出来解耦:
const markTouchOrigin = (evt: NativeSyntheticEvent<NativeTouchEvent & { origin?: string }>) => {
  evt.nativeEvent.origin = 'input'
}
// ...
onTouchEnd: markTouchOrigin,
onTouchMove: markTouchOrigin,
1. 这样共享行为更直观,也避免了潜在耦合 bug。
2. 补一行注释 —— 这个文件的风格要求如此。 周围代码注释非常密集(中文,解释 Android/键盘时序的各种坑)。这一行修复的是不直观的 Android 专属问题,并且依赖父级去读 nativeEvent.origin;加一句类似 // Android:轻微滑动的点击也需标记 origin,避免父级 KeyboardAvoidingView 误关键盘 就能贴合文件风格,省去下一个读代码的人去溯源。
3. 手测时值得验证一点: 这个修复依赖于 move 阶段设置的 origin 标记,在父级收到 touch-end 事件时仍然存在。RN 确实会复用/池化 nativeEvent,所以实践中能生效,但这依赖具体实现 —— 请在真机 Android 上确认:在 input 上“带轻微滑动的点击”不再收起键盘,同时“点击空白处收起键盘”仍然正常。另外可以顺带考虑 onTouchCancel 是否也需要同样的标记(大概率不需要,因为父级只在自己的 onTouchEnd 里判断)。

其他

- 测试: 没有新增;RN 触摸响应行为很难做单测,所以只能靠手测。可以接受,但 PR 描述里应说明验证方式(机型/系统版本)。
- 记得提交: 目前改动未暂存、分支也没有提交 —— push / 开 PR 前别忘了 commit。

结论: 功能上可直接合入。建议合并前先落实第 1、2 条 —— 成本很低,能在不改变行为的前提下避免日后踩坑。

@shulandmimi shulandmimi changed the title fix: android 在 input 上按下已移动,会导致键盘下落 fix: android 在 input 上按下并移动,会导致键盘下落 Jun 17, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant