识别一维/二维码目前用了多个模块中最好用的,在安卓中内部使用的是MLKit的barcode scanning捆绑版本,APP体积增加约3~10M。
google官方提供了barcode scanner但是没有捆绑版本(必须有谷歌套件)。
MLKit官方网址:https://developers.google.com/ml-kit/vision/barcode-scanning/ios?hl=zh-cn
依赖:https://pub.dev/packages/mobile_scanner
安装
flutter pub add mobile_scanner
核心
所必须的仅仅是MobileScanner元素和它的onDetect事件,其它都是选项
//上级页面,打开扫描页面
TextButton(onPressed: () async {
List<String> result = await Navigator.of(context).pushNamed("/scan") as List<String>;
setState(() {
codes = result; //存储在组件类的属性中
});
}, child: Text("Scan"))
import 'dart:async';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:mobile_scanner/mobile_scanner.dart';
class ScanPage extends StatefulWidget {
const ScanPage({super.key});
@override
State<ScanPage> createState() => _ScanPageState();
}
class _ScanPageState extends State<ScanPage> {
MobileScannerController? scannerController;
@override
void dispose() {
scannerController?.dispose();
super.dispose();
}
@override
void initState() {
super.initState();
scannerController = MobileScannerController(
cameraResolution: const Size(1920, 1080),
detectionTimeoutMs: 300,
// formats限制扫描类型
formats: [BarcodeFormat.ean8, BarcodeFormat.ean13, BarcodeFormat.code39, BarcodeFormat.code93, BarcodeFormat.code128],
//自动缩放只支持安卓
autoZoom: Platform.isAndroid
);
unawaited(scannerController!.start());
}
@override
Widget build(BuildContext context) {
return Container(
child: MobileScanner(
controller: scannerController, //控制器不是必须的
onDetect: (barcodeCapture){ //每次得到扫描结果就会调用这个回调
final barcodes = barcodeCapture.barcodes;
if(barcodes.isEmpty) {
return;
}
final ret = barcodes.map((e){
return e.rawValue ?? '';
}).toList();
scannerController?.stop(); //必须停止,不然会多次进入这个回调函数,多次调用pop导致APP崩溃、异常
Navigator.pop(context, ret); //将扫码结果返回上一级页面
},
),
);
}
}