Flutter条形码扫描插件learning_barcode_scanning的使用
Flutter条形码扫描插件learning_barcode_scanning的使用
通过使用Flutter的learning_barcode_scanning
插件,我们可以轻松地在应用程序中实现条形码扫描功能。该插件允许我们读取大多数标准条形码格式的数据,如Codabar、Code 39、Code 128等。
支持的格式
- 线性条形码: Codabar, Code 39, Code 93, Code 128, EAN-8, EAN-13, ITF, UPC-A, UPC-E
- 二维条形码: Aztec, Data Matrix, PDF417, QR Code
开始使用
首先,在你的Flutter项目中添加依赖项:
$ flutter pub add learning_barcode_scanning
或者在pubspec.yaml
文件中添加以下内容:
dependencies:
learning_barcode_scanning: ^0.0.2
然后运行flutter pub get
以获取新的依赖项。
使用
导入必要的包:
import 'package:learning_barcode_scanning/learning_barcode_scanning.dart';
输入图像
与其它ML视觉插件一样,输入数据是通过InputImage
实例提供的,它是learning_input_image
包的一部分。
你可以使用InputCameraView
小部件从相机或存储中获取图像流,并将其转换为InputImage
格式。以下是如何使用InputCameraView
来获取用于条形码扫描的InputImage
的示例:
import 'package:learning_input_image/learning_input_image.dart';
InputCameraView(
title: 'Barcode Scanning',
onImage: (InputImage image) {
// 现在我们可以将输入图像传递给条形码扫描器
},
)
条形码扫描
获取到InputImage
后,可以通过调用BarcodeScanner
实例上的scan
方法来开始扫描条形码。
BarcodeScanner scanner = BarcodeScanner(formats: [
BarcodeFormat.QR_CODE,
BarcodeFormat.CODE_128,
BarcodeFormat.CODE_39,
BarcodeFormat.CODE_93,
BarcodeFormat.EAN_13,
BarcodeFormat.EAN_8,
BarcodeFormat.ITF,
BarcodeFormat.UPC_A,
BarcodeFormat.UPC_E,
BarcodeFormat.CODABAR,
BarcodeFormat.DATA_MATRIX,
BarcodeFormat.PDF417
]);
List result = await scanner.scan(image);
输出
条形码扫描的结果是一个包含多个Barcode
对象的列表,这些对象根据其类型分为不同的子类。
以下是Barcode
对象的一般数据结构:
BarcodeType type // 条形码对象的类型
String value // 条形码内部的原始值
Rect? boundingBox // 条形码在图像中的边界框
List<Offset> corners // 表示条形码角点位置的点列表
以下是BarcodeType
值及其对应的Barcode
对象列表。每个Barcode
对象都是Barcode
的直接子类。
释放资源
在不再使用BarcodeScanner
时,需要调用dispose
方法释放资源:
scanner.dispose();
示例项目
你可以在这里查看完整的示例项目。
import 'package:flutter/material.dart';
import 'package:learning_barcode_scanning/learning_barcode_scanning.dart';
import 'package:learning_input_image/learning_input_image.dart';
import 'package:provider/provider.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.lightBlue,
visualDensity: VisualDensity.adaptivePlatformDensity,
primaryTextTheme: TextTheme(headline6: TextStyle(color: Colors.white)),
),
home: ChangeNotifierProvider(
create: (_) => BarcodeScanningState(),
child: BarcodeScanningPage(),
),
);
}
}
class BarcodeScanningPage extends StatefulWidget {
[@override](/user/override)
_BarcodeScanningPageState createState() => _BarcodeScanningPageState();
}
class _BarcodeScanningPageState extends State<BarcodeScanningPage> {
BarcodeScanningState get state => Provider.of(context, listen: false);
BarcodeScanner _scanner = BarcodeScanner(formats: [
BarcodeFormat.QR_CODE,
BarcodeFormat.CODE_128,
BarcodeFormat.CODE_39,
BarcodeFormat.CODE_93,
BarcodeFormat.EAN_13,
BarcodeFormat.EAN_8,
BarcodeFormat.ITF,
BarcodeFormat.UPC_A,
BarcodeFormat.UPC_E,
BarcodeFormat.CODABAR,
BarcodeFormat.DATA_MATRIX,
BarcodeFormat.PDF417
]);
[@override](/user/override)
void dispose() {
_scanner.dispose();
super.dispose();
}
Future<void> _scan(InputImage image) async {
if (state.isNotProcessing) {
state.startProcessing();
state.image = image;
state.data = await _scanner.scan(image);
state.stopProcessing();
}
}
[@override](/user/override)
Widget build(BuildContext context) {
return InputCameraView(
mode: InputCameraMode.gallery,
cameraDefault: InputCameraType.rear,
title: 'Barcode Scanning',
onImage: _scan,
overlay: Consumer<BarcodeScanningState>(
builder: (_, state, __) {
if (state.isEmpty) {
return Container();
}
return Center(
child: Container(
padding: EdgeInsets.symmetric(vertical: 10, horizontal: 16),
decoration: BoxDecoration(
color: Colors.white.withOpacity(0.8),
borderRadius: BorderRadius.all(Radius.circular(4.0)),
),
child: Text(
state.toString(),
style: TextStyle(
fontWeight: FontWeight.w500,
),
),
),
);
},
),
);
}
}
class BarcodeScanningState extends ChangeNotifier {
InputImage? _image;
List _data = [];
bool _isProcessing = false;
InputImage? get image => _image;
List get data => _data;
String? get type => _image?.type;
InputImageRotation? get rotation => _image?.metadata?.rotation;
Size? get size => _image?.metadata?.size;
bool get isProcessing => _isProcessing;
bool get isNotProcessing => !_isProcessing;
bool get isEmpty => _data.isEmpty;
void startProcessing() {
_isProcessing = true;
notifyListeners();
}
void stopProcessing() {
_isProcessing = false;
notifyListeners();
}
set isProcessing(bool isProcessing) {
_isProcessing = isProcessing;
notifyListeners();
}
set image(InputImage? image) {
_image = image;
notifyListeners();
}
set data(List data) {
_data = data;
notifyListeners();
}
[@override](/user/override)
String toString() {
if (_data.first is Barcode) {
return _data.first.value;
}
return '';
}
}
更多关于Flutter条形码扫描插件learning_barcode_scanning的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter条形码扫描插件learning_barcode_scanning的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter应用中使用learning_barcode_scanning
插件来实现条形码扫描功能的代码示例。这个示例将展示如何设置插件、请求相机权限以及扫描条形码。
首先,确保你已经在pubspec.yaml
文件中添加了learning_barcode_scanning
依赖:
dependencies:
flutter:
sdk: flutter
learning_barcode_scanning: ^0.x.x # 请替换为最新版本号
然后运行flutter pub get
来安装依赖。
接下来,是主要的Dart代码示例:
import 'package:flutter/material.dart';
import 'package:learning_barcode_scanning/learning_barcode_scanning.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: BarcodeScannerScreen(),
);
}
}
class BarcodeScannerScreen extends StatefulWidget {
@override
_BarcodeScannerScreenState createState() => _BarcodeScannerScreenState();
}
class _BarcodeScannerScreenState extends State<BarcodeScannerScreen> {
String? scannedResult;
Future<void> _scanBarcode() async {
try {
// 请求相机权限
final bool hasPermission = await Permission.camera.request().isGranted;
if (!hasPermission) {
setState(() {
scannedResult = 'Camera permission is required to scan barcode.';
});
return;
}
// 启动条形码扫描
final BarcodeScanResult? result = await BarcodeScanner.scan();
if (result != null) {
setState(() {
scannedResult = 'Barcode: ${result.rawContent} | Format: ${result.format}';
});
} else {
setState(() {
scannedResult = 'Failed to scan barcode.';
});
}
} catch (e) {
setState(() {
scannedResult = '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(
scannedResult ?? 'Press the button to scan a barcode.',
style: TextStyle(fontSize: 20),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: _scanBarcode,
child: Text('Scan Barcode'),
),
],
),
),
);
}
}
在这个示例中,我们做了以下几件事:
-
请求相机权限:使用
Permission.camera.request()
来请求相机权限。如果用户没有授予权限,我们显示一个错误消息。 -
启动条形码扫描:使用
BarcodeScanner.scan()
方法来启动条形码扫描。这个方法返回一个BarcodeScanResult
对象,包含扫描到的条形码内容和格式。 -
显示扫描结果:扫描结果将显示在屏幕上。
注意:
- 确保在Android和iOS项目中正确配置了相机权限。
- 根据
learning_barcode_scanning
插件的文档,可能还需要进行一些额外的配置,例如iOS的Info.plist文件设置等。
这个示例应该能帮助你快速上手在Flutter应用中使用learning_barcode_scanning
插件来实现条形码扫描功能。