Flutter安卓端条码扫描输入不完整问题排查与解决
Flutter TextField 无法完整识别条码扫描器输入(平板端)
平板连接条码扫描器后,扫描条码(例如Z293501924293)时,TextField频繁出现字符丢失问题:有时丢失中间字符,有时缺失末尾两位,仅偶尔能完整捕获内容,但PC端扫描完全正常。
曾尝试通过onChange、onSubmitted添加延迟处理,均未解决问题,最终通过直接捕获键盘输入事件的方式实现了稳定扫描。
原问题代码
void lookupSKU() async { final enteredText = skuController.text; print("lookupSKU triggered with: $enteredText"); // Logging the input bool success = await logic.lookupSKU(enteredText); if (success) { setState(() {}); skuController.clear(); skuFocusNode.requestFocus(); } else { CustomSnackBar.show(context, 'Invalid identifier format.'); } } SizedBox( width: 600, child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Expanded( child: TextField( autocorrect: false, autofocus: true, textInputAction: TextInputAction.done, controller: skuController, focusNode: skuFocusNode, textCapitalization: TextCapitalization.none, decoration: const InputDecoration( labelText: 'Enter SKU', border: OutlineInputBorder(), ), //onSubmitted: (value) => lookupSKU(), // Trigger lookup only on enter onSubmitted: (value) { Future.delayed(const Duration(milliseconds: 600), () { lookupSKU(); }); }, ), ), const SizedBox(width: 8), ElevatedButton( onPressed: lookupSKU, child: const Text('Lookup'), ),
修复后的代码
业务逻辑部分
void lookupSKU() async { await Future.delayed(const Duration(milliseconds: 800)); // 处理前添加短暂延迟 final enteredText = skuController.text; print("lookupSKU triggered with: $enteredText"); // Logging the input bool success = await logic.lookupSKU(enteredText); if (success) { setState(() {}); skuController.clear(); skuFocusNode.requestFocus(); } else { CustomSnackBar.show(context, 'Invalid identifier format.'); } } KeyEventResult _handleKeyEvent(FocusNode node, KeyEvent event) { if (event is KeyDownEvent) { final String key = event.character ?? ''; if (key == '\n') { // 扫描器结束输入时触发的Enter键 lookupSKU(); _bufferedInput = ""; skuFocusNode.requestFocus(); return KeyEventResult.handled; } else if (key.isNotEmpty && key.length == 1) { _bufferedInput += key; skuController.text = _bufferedInput; // 将缓存的输入同步到文本框 return KeyEventResult.handled; } } return KeyEventResult.ignored; }
UI部分
Expanded( child: Focus( focusNode: skuFocusNode, onKeyEvent: _handleKeyEvent, child: TextField( autocorrect: false, autofocus: true, textInputAction: TextInputAction.done, controller: skuController, textCapitalization: TextCapitalization.none, // 禁用自动大写 decoration: const InputDecoration( labelText: 'Enter SKU', border: OutlineInputBorder(), ), ), ) ),
内容的提问来源于stack exchange,提问作者Cody
相关产品推荐
相关产品推荐

