You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 17:13:13