Flutter数据扫描插件sbb_data_scanner的使用
Flutter数据扫描插件sbb_data_scanner的使用
获取开始
支持平台
前提条件
该插件使用了Flutter的camera
插件来访问设备相机。确保遵循其安装说明。
此外,请按照以下指南进行设置:
google_mlkit_barcode_scanning
google_mlkit_text_recognition
具体来说,设置最低的iOS和Android SDK版本以及Podfile。
代码使用
导入库后,可以在小部件树中添加一个DataScanner
。可以通过包裹在SizedBox
中来控制其大小。如果没有大小限制(例如在Row
或Column
中),DataScanner
将不会超过屏幕的宽度和/或高度(取决于方向)。
SizedBox(
height: 250,
width: 400,
child: DataScanner( /* ... */ ),
)
如果想要全屏扫描器,可以使用DataScannerPage
小部件。
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => DataScannerPage( /* ... */ ),
),
);
文档
功能
功能 | iOS | Android |
---|---|---|
光学字符识别 | ✅ | ✅ |
条形码扫描 | ✅ | ✅ |
QR码扫描 | ✅ | ✅ |
UIC编号识别 | ✅ | ✅ |
DataScanner配置
你可以通过传递DataScannerConfiguration<T>
来配置DataScanner
,其中T
表示成功提取将返回的类型。这将在下文的提取器部分详细介绍,但通常由编译器推断。几乎所有字段都有默认值,例外的是所需的processor
和extractor
值,它们将在各自的章节中介绍。
DataScanner(
scannerConfiguration: DataScannerConfiguration<T>(
processors: // 在各自的章节中覆盖
extractors: // 在各自的章节中覆盖
routeObserver: RouteObserver<ModalRoute>(),
onExtracted: (T value) {
// 当检测区域内的提取值不为空且与之前提取的值不同
},
onPermissionDenied: () {
// 当应用没有相机权限时调用
},
onError: (String error) {
// 当库遇到任何其他相机错误时调用
},
showTorchToggle: true,
torchToggleMargin: EdgeInsets.all(32),
torchToggleAlignment: Alignment.bottomCenter,
showOverlay: true,
upperHelper: Text('出现在检测区域上方'),
lowerHelper: Text('出现在检测区域下方'),
detectionAreaHeight: 75,
detectionAreaWidth: 250,
detectionAreaMode: DetectionAreaMode.containsRect,
detectionOutline: DetectionOutlineConfig(
margin: 5,
padding: 10,
activeOutlineColor: Colors.green,
inactiveOutlineColor: Colors.grey,
outlineWidth: 2,
cornerRadius: 5,
enableLabel: true,
labelColor: Colors.white,
labelSize: 12,
labelPosition: DetectionLabelPosition.bottomLeft,
),
enableZoom: true,
onZoomChanged: (double zoom) {
// 当缩放发生变化时调用,最小变化敏感度为0.01
}
),
)
视觉处理器
视觉处理器的目的是在图像中检测元素,并相对于原点(通常是左上角)返回其值和位置。
库随附了三个预配置的视觉处理器,基于Google ML Kit
:
TextRecognitionVisionProcessor
OneDimensionalBarcodeVisionProcessor
TwoDimensionalBarcodeVisionProcessor
添加处理器列表到DataScannerConfiguration
的processors
参数中:
DataScanner(
scannerConfiguration: DataScannerConfiguration(
// ...
processors: [
TextRecognitionVisionProcessor(),
// OneDimensionalBarcodeVisionProcessor(),
// TwoDimensionalBarcodeVisionProcessor()
],
),
)
还可以通过实现VisionProcessor
接口创建自定义视觉处理器。这允许库检测除文本、QR码和条形码之外的其他元素:
abstract class VisionProcessor {
Future<Map<Rect, String?>> getBoundingBoxes({
required CameraImage image,
required int imageRotation,
});
}
提取器
提取器从视觉处理器检测到的值中尝试提取特定格式的数据(如URL、UIC编号或GS1代码)。同时,它也作为过滤器,因为不匹配给定格式的检测值将被忽略。库随附了三个预配置的提取器,可通过DataScannerConfiguration
的extractors
参数提供。
提取器名称 | 返回类型 (DataScannerConfiguration的<T>) | 备注 |
---|---|---|
RawTextExtractor | String? | 仅用于单元测试 |
UICDetailsExtractor | UICDetails? | 提取UIC编号的值并提供详细描述 |
GS1DetailsExtractor | GS1Details? | 提取GS1代码的值并提供详细描述 |
示例UICDetailsExtractor
实现:
DataScanner(
scannerConfiguration: DataScannerConfiguration<UICDetails>(
// ...
extractors: [
UICDetailsExtractor(/* ... */),
],
),
)
自定义提取器
对于URL、电话号码和Nestlé品牌等格式,如何提取?
很简单,只需实现Extractor<T>
接口即可。
abstract class Extractor<T> {
T? extract(String? input);
}
extract
方法必须返回一个可空类型。什么时候返回null
?很简单:当由于格式问题、输入缺少组件或错误导致无法提取值时。这会导致ScannerConfiguration.onExtracted
不被触发,因为检测到的值格式无效。
例如,这里是一个简单的CompoundSentenceExtractor
,它只提取包含逗号和句点结尾的复合句子。
class CompoundSentenceExtractor implements Extractor<String> {
String? extract(String? input) {
if (input == null) return null;
final containsComma = input.contains(',');
final isSentence = input.endsWith('.');
// 当然,",." 是一个有效的复合句子!
return containsComma && isSentence ? input : null;
}
}
现在可以使用自己的提取器:
DataScanner(
scannerConfiguration: DataScannerConfiguration<String>(
// ...
extractors: [
CompoundSentenceExtractor(),
],
),
)
更多关于Flutter数据扫描插件sbb_data_scanner的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter数据扫描插件sbb_data_scanner的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中集成和使用sbb_data_scanner
插件的一个基本示例。这个插件可以帮助你实现二维码、条形码等数据扫描功能。
1. 添加依赖
首先,在你的pubspec.yaml
文件中添加sbb_data_scanner
依赖:
dependencies:
flutter:
sdk: flutter
sbb_data_scanner: ^最新版本号 # 替换为实际的最新版本号
然后运行以下命令来安装依赖:
flutter pub get
2. 导入包
在你的Dart文件中导入sbb_data_scanner
包:
import 'package:sbb_data_scanner/sbb_data_scanner.dart';
3. 请求权限
在Android上,你需要在AndroidManifest.xml
中添加相机权限:
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
对于iOS,你需要在Info.plist
中添加相机使用描述:
<key>NSCameraUsageDescription</key>
<string>需要相机权限来扫描二维码</string>
4. 使用插件
以下是一个完整的示例,展示如何在Flutter应用中启动扫描器并处理扫描结果:
import 'package:flutter/material.dart';
import 'package:sbb_data_scanner/sbb_data_scanner.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Scanner Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: ScannerScreen(),
);
}
}
class ScannerScreen extends StatefulWidget {
@override
_ScannerScreenState createState() => _ScannerScreenState();
}
class _ScannerScreenState extends State<ScannerScreen> {
final SbbDataScannerController _controller = SbbDataScannerController();
String _result = '';
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Scanner Demo'),
),
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Expanded(
child: SbbDataScanner(
controller: _controller,
onScanResult: (result) {
setState(() {
_result = result;
});
_controller.stopScanning();
// 显示结果或进行其他操作
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text('扫描结果'),
content: Text(_result),
actions: <Widget>[
TextButton(
onPressed: () {
Navigator.of(context).pop();
// 重启扫描
_controller.startScanning();
},
child: Text('继续扫描'),
),
],
);
},
);
},
),
),
Text(
_result.isEmpty ? '等待扫描...' : '扫描结果: $_result',
style: TextStyle(fontSize: 20),
),
],
),
floatingActionButton: FloatingActionButton(
onPressed: () {
// 开始扫描
_controller.startScanning();
},
tooltip: 'Start Scanning',
child: Icon(Icons.camera_alt),
),
);
}
}
5. 运行应用
确保你的设备或模拟器已连接,并运行以下命令来启动应用:
flutter run
这个示例展示了如何集成sbb_data_scanner
插件,启动扫描器,并在扫描到数据后处理结果。你可以根据实际需求进一步定制UI和逻辑。