likes
comments
collection
share

如何从零开始实现Flutter条码扫描器

作者站长头像
站长
· 阅读数 57

大约两年前,我写了一篇文章,分享了如何用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() 函数。

以下是特定平台代码的基本步骤。

  1. 从Dart框架中提取参数。
  2. 处理图像数据。
  3. 返回结果。

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包装盒上的一维条码和二维码进行识别测试。

视频条码扫描

如何从零开始实现Flutter条码扫描器

图片条码扫描

如何从零开始实现Flutter条码扫描器

前提条件

iOS, Web, 和Windows。

源代码

github.com/yushulx/flu…

转载自:https://juejin.cn/post/6965354417130307614
评论
请登录