feat:查询菜谱适配小键盘硬件
This commit is contained in:
1 parent
a179729e79
commit
8e9bcba3c3
11 files changed
+861
-7
No files matched your search
@@ -0,0 +1,34 @@
|
||||
# 修复"绑定按键按下 e 后无响应/软键盘弹出"问题
|
||||
|
||||
## 根因
|
||||
|
||||
截图证明"取消"行已进入"等待按键…"监听态,但按"e"后**没有任何 Toast、没有任何绑定变化** —— 说明按键事件根本没到达 `HardwareKeyboard` 的监听 handler(若到达,成功/冲突都必有 Toast)。
|
||||
|
||||
结合"按 e 时软键盘弹出",根因是 **Android IME(输入法)拦截**:
|
||||
|
||||
1. 当输入法连接处于激活状态(软键盘弹出、或此前某个输入框残留焦点未释放)时,Android 会把物理键盘的字符键(如 e)先交给输入法,**合成为文本提交**,不再作为 KeyEvent 分发给 Flutter —— 我们的 handler 因此收不到任何 KeyDownEvent。
|
||||
2. 若用户按的是**屏幕软键盘上的"e"**(小键盘尚未接入、用软键盘模拟测试),同样只产生 IME 文本提交,Flutter 侧本来就收不到"按了哪个键"的按键事件 —— 软键盘按键**机制上无法**用于绑定。
|
||||
|
||||
排查确认:设置模块存在多个可激活 IME 的入口(日志预览关键词筛选框、读写卡密钥三个输入框、食堂机型人脸姓名搜索框、`autofocus: true` 的人工硬件输入弹窗);而我们的 `_startListening` **只注册了键盘监听器,没有断开输入焦点** —— 项目里 `BarcodeScanManage`(扫码枪)正是因为同样的问题,在监听前和每次事件时都先 `unfocus()`。
|
||||
|
||||
## 修复内容(仅改 1 个文件)
|
||||
|
||||
`lib/pages/terminal/setting/widgets/setting_menu_query_shortcut.dart`:
|
||||
|
||||
1. **`_startListening` 进入监听时断开输入焦点并隐藏软键盘**(对齐项目既有防御写法 `barcode_scan_manage.dart:63` 与 `order_history/view.dart:433-434` 组合):
|
||||
```dart
|
||||
FocusManager.instance.primaryFocus?.unfocus();
|
||||
SystemChannels.textInput.invokeMethod<void>('TextInput.hide');
|
||||
```
|
||||
确保真实小键盘的物理按键走 KeyEvent 路径直达监听器,不被输入法吞掉。
|
||||
|
||||
2. **提示文案说明软键盘不可用**:等待提示与空闲提示明确"请按外接小键盘的物理按键,屏幕软键盘按键无法完成绑定",避免现场用软键盘测试时误判功能损坏。
|
||||
|
||||
## 验证
|
||||
|
||||
- `flutter analyze` + `dart format` 改动文件;
|
||||
- 说明清楚:软键盘按键在 Flutter 中不产生按键事件,属于平台机制,绑定功能需接入真实外接小键盘后才能完整验证(本次修复保证接入后 IME 不再拦截)。
|
||||
|
||||
## 变更统计
|
||||
|
||||
预计新增约 12 行 / 删除 2 行(单文件小改)。
|
||||
Reference in new issue
Block a user