Administrator
Administrator
Published on 2025-06-09 / 1 Visits
0
0

mobile_scanner

识别一维/二维码目前用了多个模块中最好用的,在安卓中内部使用的是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); //将扫码结果返回上一级页面
        },
      ),
    );
  }
}


Comment