Flutter条码扫描插件scan_gun的使用

Flutter条码扫描插件scan_gun的使用

实现扫码枪获取数据源,禁止系统键盘弹窗

实现扫码枪获取数据源,禁止系统键盘弹窗。依赖 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.currentState?.requestKeyboard()
    
  • textFiledNode:

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

  • focusLooper:

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

  • onSubmit:

    接收扫码枪返回的结果。

适用场景及Demo演示

1. 无输入框交互,获取扫码结果:
[@override](/user/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](/user/override)
Widget build(BuildContext context) {
  return ScanMonitorWidget(
    textFiledNode: textFiledNode,
    childBuilder: (context) {
      return body();
    },
    onSubmit: (String result) {
      print(result); // 接收到扫码结果
    },
  );
}

示例代码

以下是完整的示例代码:

import 'package:flutter/material.dart';
import 'package:scan_gun/scan_gun.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'scan_gun_demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: const Text('扫码枪测试'),
        ),
        body: const TestScanGun(),
      ),
    );
  }
}

class TestScanGun extends StatefulWidget {
  const TestScanGun({Key? key}) : super(key: key);

  [@override](/user/override)
  _TestScanGunState createState() => _TestScanGunState();
}

class _TestScanGunState extends State<TestScanGun> {
  final FocusNode textFiledNode = FocusNode();
  final TextEditingController controller = TextEditingController();

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

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

  [@override](/user/override)
  void dispose() {
    textFiledNode.dispose();
    controller.dispose();
    super.dispose();
  }
}

更多关于Flutter条码扫描插件scan_gun的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter条码扫描插件scan_gun的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


scan_gun 是一个用于 Flutter 的条码扫描插件,它允许你通过连接外部扫描枪设备来扫描条码。这个插件特别适用于需要使用硬件扫描枪的场景,而不是通过手机摄像头进行扫描。

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 scan_gun 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  scan_gun: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来获取依赖。

2. 基本用法

2.1 初始化扫描枪

在需要使用扫描枪的地方,你可以通过 ScanGun 类来初始化和监听扫描事件。

import 'package:flutter/material.dart';
import 'package:scan_gun/scan_gun.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: BarcodeScannerScreen(),
    );
  }
}

class BarcodeScannerScreen extends StatefulWidget {
  [@override](/user/override)
  _BarcodeScannerScreenState createState() => _BarcodeScannerScreenState();
}

class _BarcodeScannerScreenState extends State<BarcodeScannerScreen> {
  String _barcode = '';

  [@override](/user/override)
  void initState() {
    super.initState();
    _initScanGun();
  }

  void _initScanGun() {
    ScanGun.init().then((_) {
      ScanGun.onScanned.listen((barcode) {
        setState(() {
          _barcode = barcode;
        });
      });
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Barcode Scanner'),
      ),
      body: Center(
        child: Text('Scanned Barcode: $_barcode'),
      ),
    );
  }

  [@override](/user/override)
  void dispose() {
    ScanGun.dispose();
    super.dispose();
  }
}
回到顶部