Flutter二维码扫描插件flexible_barcode_scanner的使用

发布于 1周前 作者 songsunli 来自 Flutter

Flutter二维码扫描插件flexible_barcode_scanner的使用

简介

flexible_barcode_scanner 是一个高度可定制且高效的二维码扫描库,基于Flutter构建。该插件使用了camera包和Google ML Kit Barcode Scanning功能,提供了实时二维码扫描,并支持自定义配置、动画覆盖等功能。

功能特性

  • 可定制的相机视图:可以通过自定义覆盖层和操作来修改相机预览。
  • 二维码检测:支持多种二维码格式,使用Google ML Kit进行识别。
  • 动画覆盖:包含优雅的动画效果,提供扫描反馈。
  • 相机切换:轻松切换前后摄像头。
  • 手电筒开关:在低光环境下启用或禁用手电筒以提高扫描效果。
  • 平台兼容性:完全支持Android和iOS平台。

示例截图

Image 1 Image 2 Image 3

安装

pubspec.yaml文件中添加以下依赖:

dependencies:
  flexible_barcode_scanner: ^0.0.12

设置

iOS设置

Podfile中添加以下内容:

platform :ios, '15.5.0'  # 或更新版本
$iOSVersion = '15.5.0'  # 或更新版本

post_install do |installer|
  installer.pods_project.build_configurations.each do |config|
    config.build_settings["EXCLUDED_ARCHS[sdk=*]"] = "armv7"
    config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = $iOSVersion
  end
  installer.pods_project.targets.each do |target|
    flutter_additional_ios_build_settings(target)
    target.build_configurations.each do |config|
      if Gem::Version.new($iOSVersion) > Gem::Version.new(config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'])
        config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = $iOSVersion
      end
    end
  end
end

Info.plist中添加以下权限:

<key>NSCameraUsageDescription</key>
<string>需要相机权限来扫描二维码</string>
Android设置

android/App/build.gradle中设置以下内容:

minSdkVersion: 21
targetSdkVersion: 33
compileSdkVersion: 34

android/app/src/main/AndroidManifest.xml中添加以下权限:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT" />

使用示例

下面是一个完整的示例代码,展示了如何使用flexible_barcode_scanner插件进行二维码扫描:

import 'package:flutter/material.dart';
import 'package:flexible_barcode_scanner/flexible_barcode_scanner.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Barcode Scanner',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Flutter Barcode Scanner'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String barcode = "";

  void _scanBarcode() async {
    // 调用scanBarcode方法进行二维码扫描
    final resultbarcode = await scanBarcode(
      context,
      backButtonIcon: const Icon(
        Icons.arrow_back,
        color: Colors.blue,
      ),
      loadingWidget: CircularProgressIndicator(
        color: Colors.green,
      ),
      flashButtonIcon: const Icon(
        Icons.sunny,
        color: Colors.yellow,
      ),
      openedFlashIcon: const Icon(
        Icons.dark_mode,
        color: Colors.red,
      ),
      switchCameraButtonIcon: const Icon(
        Icons.camera_alt,
        color: Colors.orange,
      ),
      strokeColor: Colors.purple,
      lineColor: Colors.pink,
      backButtonBackgroundColor: Colors.cyanAccent,
      flashBackgroundColor: Colors.indigo,
      initialCameraDirection: CameraDirection.back,
      switchCameraBackgroundColor: Colors.amber,
    );

    // 更新UI显示扫描结果
    setState(() {
      if (resultbarcode != "-1") {
        barcode = resultbarcode;
      }
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text(
              '下方将显示扫描到的二维码信息:',
            ),
            Text(
              barcode,
              style: Theme.of(context).textTheme.headlineMedium,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _scanBarcode,
        tooltip: '扫描二维码',
        child: const Icon(Icons.barcode_reader),
      ),
    );
  }
}

更多关于Flutter二维码扫描插件flexible_barcode_scanner的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter二维码扫描插件flexible_barcode_scanner的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用 flexible_barcode_scanner 插件在 Flutter 中实现二维码扫描功能的代码示例。这个插件允许你在 Flutter 应用中快速集成二维码扫描功能。

首先,确保你已经在 pubspec.yaml 文件中添加了 flexible_barcode_scanner 依赖项:

dependencies:
  flutter:
    sdk: flutter
  flexible_barcode_scanner: ^3.0.0  # 请检查最新版本号

然后,运行 flutter pub get 来安装依赖项。

接下来,你可以在你的 Flutter 应用中使用这个插件。以下是一个简单的示例,展示了如何启动二维码扫描器并处理扫描结果。

import 'package:flutter/material.dart';
import 'package:flexible_barcode_scanner/flexible_barcode_scanner.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('二维码扫描示例'),
        ),
        body: Center(
          child: ScanButtonWidget(
            onPressed: _startBarcodeScanner,
          ),
        ),
      ),
    );
  }

  void _startBarcodeScanner() async {
    try {
      // 启动二维码扫描器
      String result = await FlexibleBarcodeScanner.scan({
        // 可选配置参数
        'beep': 'true',
        'resultDisplayDuration': '2000', // 结果显示时长,单位毫秒
        'orientation': 'portrait', // 扫描器方向
        'scanBoxArea': '0,0,1,1', // 扫描区域,格式为 "left,top,width,height"(比例)
        'scanBarcodes': true, // 是否扫描条形码
        'scanQRCode': true, // 是否扫描二维码
        'torch': 'false', // 是否开启手电筒
      });

      // 显示扫描结果
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(
          content: Text('扫描结果: $result'),
        ),
      );
    } catch (e) {
      // 处理错误
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(
          content: Text('扫描失败: ${e.toString()}'),
        ),
      );
    }
  }
}

// 自定义扫描按钮
class ScanButtonWidget extends StatelessWidget {
  final VoidCallback onPressed;

  ScanButtonWidget({required this.onPressed});

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: onPressed,
      child: Text('扫描二维码'),
    );
  }
}

在这个示例中,我们创建了一个简单的 Flutter 应用,其中包含一个按钮,点击按钮后会启动二维码扫描器。扫描完成后,结果会显示为一个 SnackBar。

注意事项

  1. 权限:在 Android 和 iOS 上使用摄像头需要相应的权限。确保在 AndroidManifest.xmlInfo.plist 中正确配置这些权限。
  2. 插件版本flexible_barcode_scanner 插件的版本可能会更新,请确保使用最新版本的插件以避免潜在的兼容性问题。
  3. UI 定制flexible_barcode_scanner 提供了许多配置选项,可以根据需要定制扫描器的行为和外观。

希望这个示例能帮助你快速集成二维码扫描功能到你的 Flutter 应用中!

回到顶部