Flutter二维码及条形码扫描插件combined_barcode_scanner的使用
Flutter二维码及条形码扫描插件combined_barcode_scanner的使用
combined_barcode_scanner
是一个用于创建新的条形码和二维码扫描器的 Flutter 插件。它允许你将多个不同的扫描器组合成一个单一的扫描源。以下是如何使用该插件的详细说明和示例代码。
基本概念
1. 创建自定义扫描器
要实现自定义扫描器,你需要导入 combined_barcode_scanner
包,并实现 BarcodeScanner
和 BarcodeScannerController
的子类。
2. 快速开始
在使用 combined_barcode_scanner
时,你可能会遇到一些已知的问题。例如,FastBarcodeScanner()
未找到的问题。你可以参考 GitHub 上的 Issue 获取临时解决方案。
示例用法
以下是一个完整的示例代码,展示了如何使用 combined_barcode_scanner
进行二维码和条形码扫描。
依赖项
首先,在你的 pubspec.yaml
文件中添加 combined_barcode_scanner
及其相关的依赖项:
dependencies:
flutter:
sdk: flutter
combined_barcode_scanner: ^0.1.0
combined_barcode_scanner_blue_bird: ^0.1.0
combined_barcode_scanner_fast: ^0.1.0
combined_barcode_scanner_honeywell: ^0.1.0
combined_barcode_scanner_unitech: ^0.1.0
combined_barcode_scanner_usb_keyboard: ^0.1.0
combined_barcode_scanner_zebra: ^0.1.0
主要代码
import 'package:combined_barcode_scanner/combined_barcode_scanner.dart';
import 'package:combined_barcode_scanner_blue_bird/combined_barcode_scanner_blue_bird.dart';
import 'package:combined_barcode_scanner_fast/combined_barcode_scanner_fast.dart';
import 'package:combined_barcode_scanner_honeywell/combined_barcode_scanner_honeywell.dart';
import 'package:combined_barcode_scanner_unitech/combined_barcode_scanner_unitech.dart';
import 'package:combined_barcode_scanner_usb_keyboard/combined_barcode_scanner_usb_keyboard.dart';
import 'package:combined_barcode_scanner_zebra/combined_barcode_scanner_zebra.dart';
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
late final _controller = BarcodeScannerWidgetController(_onScannerLoaded);
bool _supportsSwitchingCamera = false;
bool _supportsSwitchingTorch = false;
bool _supportsZebraScan = false;
String? _code;
final _scanners = [
FastBarcodeScanner(),
HoneywellBarcodeScanner(),
UnitechBarcodeScanner(),
BlueBirdBarcodeScanner(),
ZebraBarcodeScanner('my_profile'),
UsbKeyboardScanner(),
];
@override
void initState() {
super.initState();
_controller.supportsSwitchingCamera
.then((bool value) => setState(() => _supportsSwitchingCamera = value));
_controller.supportsSwitchingTorch
.then((bool value) => setState(() => _supportsSwitchingTorch = value));
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
void _onScannerLoaded() {
setState(() {
_supportsZebraScan = _controller.supportsScanner<ZebraBarcodeScanner>();
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Column(
children: [
Expanded(
child: ClipRect(
child: BarcodeScannerWidget(
controller: _controller,
onScan: (code) {
setState(() {
_code = code.code;
});
print("GOT BARCODE =========== ${code.code}");
},
configuration: const ScannerConfiguration(
trimWhiteSpaces: true,
enableFormats: {
BarcodeFormat.qr,
BarcodeFormat.code128,
},
cameraConfiguration: CameraConfiguration(
frameRate: 30,
mode: BarcodeDetectionMode.continuous,
resolution: CameraResolution.medium,
type: CameraType.back,
),
),
scanners: _scanners,
),
),
),
Text(
'Code: ${_code ?? 'N/A'}',
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
if (_supportsSwitchingTorch) ...[
MaterialButton(
child: Icon(
_controller.isTorchOn ? Icons.flash_off : Icons.flash_on,
),
onPressed: () {
_controller.toggleTorch();
setState(() {});
},
),
],
if (_supportsSwitchingCamera) ...[
MaterialButton(
child: Icon(Icons.flip_camera_ios),
onPressed: _controller.toggleCamera,
),
],
if (_supportsZebraScan) ...[
Icon(Icons.barcode_reader),
],
],
),
],
),
);
}
}
代码说明
- 导入依赖:导入
combined_barcode_scanner
及其相关的子包。 - 初始化控制器:创建
BarcodeScannerWidgetController
实例,并在initState
中初始化相机和手电筒的支持情况。 - 配置扫描器:在
BarcodeScannerWidget
中配置扫描器的参数,包括支持的条形码格式、相机配置等。 - 处理扫描结果:在
onScan
回调中处理扫描到的条形码或二维码,并更新 UI 显示。 - 按钮控制:根据设备支持的情况,添加切换手电筒和相机的按钮。
通过以上步骤,你可以在 Flutter 应用中集成 combined_barcode_scanner
插件,实现二维码和条形码的扫描功能。
更多关于Flutter二维码及条形码扫描插件combined_barcode_scanner的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter二维码及条形码扫描插件combined_barcode_scanner的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用combined_barcode_scanner
插件进行二维码及条形码扫描的示例代码。
首先,确保你已经在pubspec.yaml
文件中添加了combined_barcode_scanner
依赖:
dependencies:
flutter:
sdk: flutter
combined_barcode_scanner: ^x.y.z # 请将x.y.z替换为最新版本号
然后运行flutter pub get
来安装依赖。
接下来,我们编写一个示例应用,展示如何使用这个插件。
主文件 main.dart
import 'package:flutter/material.dart';
import 'package:combined_barcode_scanner/combined_barcode_scanner.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Barcode Scanner Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: BarcodeScannerScreen(),
);
}
}
class BarcodeScannerScreen extends StatefulWidget {
@override
_BarcodeScannerScreenState createState() => _BarcodeScannerScreenState();
}
class _BarcodeScannerScreenState extends State<BarcodeScannerScreen> {
String _result = '';
Future<void> _scanBarcode() async {
try {
String result = await CombinedBarcodeScanner()
.scan(
options: ScanOptions(
// 可以根据需要自定义扫描选项,例如:
// beepOnScan: true,
// android: AndroidOptions(
// promptMessage: "Scan a barcode",
// orientationLocked: false,
// cancelButtonText: "CANCEL",
// bezelColor: Colors.transparent,
// ),
// ios: IOSOptions(
// rectOfInterest: Rect.fromLTWH(200, 200, 400, 400),
// ),
),
)
.first;
setState(() {
_result = result;
});
} catch (e) {
print("Error scanning barcode: $e");
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Barcode Scanner Demo'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'Scan Result:',
style: TextStyle(fontSize: 20),
),
SizedBox(height: 20),
Text(
_result,
style: TextStyle(fontSize: 24),
),
SizedBox(height: 40),
ElevatedButton(
onPressed: _scanBarcode,
child: Text('Scan Barcode'),
),
],
),
),
);
}
}
说明
- 依赖添加:在
pubspec.yaml
中添加combined_barcode_scanner
依赖。 - 扫描功能:在
_scanBarcode
函数中,我们使用CombinedBarcodeScanner().scan()
方法来启动扫描器。这个方法是异步的,返回扫描结果。 - UI展示:在UI中,我们有一个
Text
控件显示扫描结果,以及一个ElevatedButton
控件触发扫描操作。 - 扫描选项:
ScanOptions
允许你自定义扫描行为,例如是否发出蜂鸣声、Android和iOS的特定选项等。在示例代码中,这些选项被注释掉了,但你可以根据需要启用它们。
运行这个应用,点击“Scan Barcode”按钮,将会启动设备上的摄像头进行二维码或条形码的扫描,并将结果显示在屏幕上。