如何从零开始实现Flutter条码扫描器
大约两年前,我写了一篇文章,分享了如何用Dynamsoft Barcode Reader一步步建立一个Flutter条码插件。那时候,Flutter还在开发中,只支持Android和iOS。如今,谷歌已经发布了Flutter 2,它允许开发者从一个代码库中为移动、网络和桌面构建应用程序。如果你想构建跨平台的应用程序,那么从现在开始,值得在Flutter上投入很多精力。由于新的Flutter与旧的Flutter不兼容,我决定重构Flutter条码插件的API,并添加一个新的方法来支持实时的视频流条码扫描。
Flutter条码SDK插件
在下面的段落中,我将演示如何开发一个支持从图像文件和图像缓冲区读取条形码的Flutter条形码插件,以及如何将该插件发布到pub.dev。
使用Dynamsoft条码阅读器开发Flutter条码SDK插件
我目前的计划是使该插件适用于Android。因此,我创建了如下的插件包。
flutter create --org com.dynamsoft --template=plugin --platforms=android -a java flutter_barcode_sdk
为了在插件项目中添加其他平台的代码,如iOS,我可以运行。
flutter create --template=plugin --platforms=ios .
插件的API是在lib/flutter_barcode_sdk.dart
文件中定义的,它是Dart代码和平台特定代码之间的桥梁。一个android/src/main/java/com/dynamsoft/flutter_barcode_sdk/FlutterBarcodeSdkPlugin.java
文件被生成,作为Android的入口点。
Dart代码
让我们开始使用lib/flutter_barcode_sdk.dart
。
第一步是定义一个BarcodeResult
类,它包含条形码格式、结果和坐标点,用于反序列化从平台特定代码返回的JSON数据。
为图片和视频流场景分别创建方法decodeFile()
和decodeImageBuffer()
。
_convertResults()
函数用于将List<Map<dynamic, dynamic>>
类型转换为<List<BarcodeResult>>
类型。
Java代码
当调用Flutter API时,将触发AndroidonMethodCall()
函数。
以下是特定平台代码的基本步骤。
- 从Dart框架中提取参数。
- 处理图像数据。
- 返回结果。
decodeImageBuffer
方法是为相机流设计的。为了避免阻塞主线程,我使用SingleThreadExectuor
,在一个工作线程中处理CPU密集型工作。
发布 Flutter Barcode SDK 插件到 Pub.dev
在发布插件之前,你最好通过运行命令来分析。
flutter pub publish --dry-run
如果没有错误,您可以将包发布到pub.dev。
flutter pub publish
我已经成功发布了Flutter条码SDK到pub.dev/packages/fl…。
插件完成后,是时候用几行Dart代码建立一个条码扫描器应用了。
首先,我将Flutter相机插件和flutter_barcode_sdk添加到pubspec.yaml
文件中。
然后,在main.dart
中初始化相机和条码阅读器对象。
该应用程序由一个相机视图、一个文本小部件和两个按钮小部件组成。
在videoScan()
函数中,我调用startImageStream()来持续获得最新的视频帧并调用条码解码API。
pictureScan()
函数从图像中读取条形码,并在图片屏幕上显示图像和结果。
最后,我可以建立并运行该应用程序。
flutter run
对Raspberry Pi包装盒上的一维条码和二维码进行识别测试。
视频条码扫描
图片条码扫描
前提条件
iOS, Web, 和Windows。
源代码
转载自:https://juejin.cn/post/6965354417130307614