ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

flutter_barcode_reader的ScanResult完全指南:3种结果类型与异常处理一步到位

2026/8/24 17:14:45 拓冰建站 浏览量
flutter_barcode_reader的ScanResult完全指南:3种结果类型与异常处理一步到位 flutter_barcode_reader的ScanResult完全指南3种结果类型与异常处理一步到位【免费下载链接】flutter_barcode_readerA flutter plugin for reading 2D barcodes and QR codes.项目地址: https://gitcode.com/gh_mirrors/fl/flutter_barcode_readerflutter_barcode_reader包名barcode_scan是一款通过摄像头读取 2D 条形码与二维码的 Flutter 条码扫描插件同时支持 Android 与 iOS。调用一次BarcodeScanner.scan()后所有扫描信息都会封装在一个ScanResult对象中返回。本文带你彻底搞懂 ScanResult 的 4 个核心字段、3 种结果类型以及相机权限被拒时如何优雅处理异常。一、ScanResult 是什么4个字段一次看懂ScanResult是整个扫描流程的唯一出口无论成功、取消还是出错插件都会返回它。类定义位于lib/model/scan_result.dart底层字段结构由protos/scan_result.proto协议描述跨平台通过 Protobuf 序列化传递保证两端行为一致。字段类型含义typeResultType结果类型Barcode/Cancelled/Error三选一rawContentString成功时是条码内容出错时是错误信息formatBarcodeFormat条码格式qr、ean13、code128等formatNoteString格式为 unknown 时的补充说明 注意一个容易踩坑的点rawContent是复用字段——type Barcode时它是你要的条码内容type Error时它变成了错误描述。所以处理结果时必须先看type再看rawContent。二、3种结果类型详解ResultType枚举在protos/scan_result.proto中定义共 3 个值。1. Barcode —— 扫描成功 ✅最常见的情况摄像头识别到条码并返回。rawContent条码里的实际内容如https://example.com、商品编码format识别出的格式常见取值包括qr、aztec、dataMatrix、ean8、ean13、code128、pdf417等完整列表见lib/gen/protos/protos.pbenum.dart2. Cancelled —— 用户主动取消 用户在预览界面点击了取消按钮iOS 上默认文案 Cancel可通过ScanOptions.strings自定义。此时rawContent为空直接忽略结果即可不要当错误处理。3. Error —— 扫描过程出错 ⚠️原生层发生异常例如 Android 上扫码 Activity 返回了错误码。此时rawContent错误信息如错误码字符串format固定为BarcodeFormat.unknownAndroid 端的这一分支逻辑见android/src/main/kotlin/de/mintware/barcode_scan/ScanResultHandler.kt当 Activity 返回非 OK / CANCELED 的结果时插件会自动构造一个type Error的ScanResult回传给 Dart 层。三、异常处理模板相机权限被拒怎么接ScanResult 处理的是扫描阶段的问题但还有一个更外层的异常相机权限。在 Android 上如果用户拒绝相机权限BarcodeScanner.scan()不会返回 ScanResult而是直接抛出PlatformException错误码PERMISSION_NOT_GRANTED处理入口在lib/platform_wrapper.dart。官方示例 App 给出的标准写法参考example/lib/main.dart建议直接照抄这套 try/catch 模板try { var result await BarcodeScanner.scan(); switch (result.type) { case ResultType.Barcode: print(扫到条码${result.rawContent}格式${result.format}); break; case ResultType.Cancelled: print(用户取消了扫描); break; case ResultType.Error: print(扫描出错${result.rawContent}); break; } } on PlatformException catch (e) { if (e.code BarcodeScanner.cameraAccessDenied) { print(用户未授予相机权限); } else { print(未知错误$e); } } 两个关键常量都在BarcodeScanner类上BarcodeScanner.cameraAccessGrantedPERMISSION_GRANTEDBarcodeScanner.cameraAccessDeniedPERMISSION_NOT_GRANTED判断异常时请对比e.code BarcodeScanner.cameraAccessDenied不要硬编码字符串。四、最小示例3行代码跑通完整流程如果你的需求很简单只扫一次、默认相机、默认文案整个流程只需要这样var result await BarcodeScanner.scan(); if (result.type ResultType.Barcode) { print(条码内容${result.rawContent}); }进阶场景再传ScanOptions限制格式、指定摄像头、自动开闪光灯等字段说明见lib/model/scan_options.dart。五、总结一张速查表场景typerawContent内容你应该怎么做扫到条码Barcode条码内容提取内容按format分类处理用户点取消Cancelled空静默忽略不打扰用户原生层出错Error错误信息提示用户重试相机权限被拒—抛异常—catchPlatformException引导用户去系统设置开权限掌握先判type再读rawContent外层套一层权限异常捕获这三条原则你在 flutter_barcode_reader 中遇到的条码扫描结果问题就能一步到位了。【免费下载链接】flutter_barcode_readerA flutter plugin for reading 2D barcodes and QR codes.项目地址: https://gitcode.com/gh_mirrors/fl/flutter_barcode_reader创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考