/flutter_scan_gun

flutter:usb 即插款扫码枪通用方案。(适用各平台,不会触发键盘唤起,不会触发中文乱码)

Primary LanguageDartBSD 3-Clause "New" or "Revised" LicenseBSD-3-Clause

flutter:实现扫码枪获取数据源,禁止系统键盘弹窗(不会触发键盘唤起,不会触发中文乱码)

实现扫码枪获取数据源,禁止系统键盘弹窗。依赖 EditableText 原理,实现 flutter 端扫码能力支持。 (不会触发键盘唤起,不会触发中文乱码)

引入

在pubspec.yaml文件中进行引用:

dependencies:
  scan_gun: ^2.0.0

使用方式:

在 main 方法中初始化 TextInputBinding

 void main() {
   TextInputBinding();
   runApp(const MyApp());
 }

提供 ScanMonitorWidget 作为父节点,嵌套使用:

  ScanMonitorWidget({
    Key? key,
    required ChildBuilder childBuilder,
    FocusNode? scanNode,
    FocusNode? textFiledNode,
    required void Function(String) onSubmit,
  })

参数说明:

  • childBuilder :

typedef ChildBuilder = Widget Function(BuildContext context),使用者自己UI作为子节点

  • scanNode:

非必传,如果传,可通过 scanNode 监听获取当前扫码可用状态,hasFocus 时为获取焦点

  • GlobalKey scanKey:

非必传,如果传,可通过 'scanKey' 强制获取获取焦点,保证扫码可用,如下 scanKey.currentState?.requestKeyboard()

  • textFiledNode:

提供外部存在输入框键盘输入与扫码输入同时存在的场景。内部做了焦点切换能力,保证输入框焦点取消后,能马上切换成扫码枪的焦点

  • focusLooper:

非必传,传true可开启轮询保活扫码焦点,但需要保证当前页面堆栈只存在一个 ScanMonitorWidget

  • onSubmit:

接收扫码枪返回的结果

适用场景及Demo演示:

1. 无输入框交互,获取扫码结果:

@override
  Widget build(BuildContext context) {
    return ScanMonitorWidget(
      childBuilder: (context) {
        return body();
      },
      onSubmit: (String result) {
        print(result); //接收到扫码结果
      },
    );
  }

2. 带输入框交互,获取扫码结果:

FocusNode textFiledNode = FocusNode();
TextEditingController controller = TextEditingController();

 Widget body() {
  return TextField(
     focusNode: textFiledNode,
     controller: controller,
   );
 }

@override
  Widget build(BuildContext context) {
    return ScanMonitorWidget(
      textFiledNode: textFiledNode,
      childBuilder: (context) {
        return body();
      },
      onSubmit: (String result) {
        print(result); //接收到扫码结果
      },
    );
  }

详细使用方式可查看 example :

技术点分析