Flutter条码扫描插件flutter_barcode_reader的使用

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

Flutter条码扫描插件flutter_barcode_reader的使用

flutter_barcode_reader 是一个用于在Flutter应用中添加条码扫描功能的插件,支持Android和iOS平台。以下是如何使用该插件的详细步骤及示例代码。

安装与配置

Android

对于Android平台,无需进行额外配置。

iOS

iOS平台需要Swift支持,具体步骤如下:

  1. 创建新项目或修改现有项目

    • 如果是新建项目,请确保选择“Include Swift support for iOS code”。
    • 设置最低部署目标为12,并将Swift版本设置为5。
    • /ios目录下运行pod install
  2. 修改现有项目

    • 如果现有iOS代码是Swift,只需设置最低部署目标为12,并将Swift版本设置为5,然后运行pod install
    • 如果现有iOS代码是Objective-C,则需创建一个新的带有Swift支持的Flutter项目,复制新的/ios文件夹替换现有项目中的/ios文件夹,并进行上述设置。
  3. 权限配置

    • 在Xcode中打开Info.plist,添加相机使用描述:
      <key>NSCameraUsageDescription</key>
      <string>Camera permission is required for barcode scanning.</string>
      
  4. 添加依赖

    • pubspec.yaml中添加依赖:
      dependencies:
        flutter:
          sdk: flutter
        flutter_barcode_reader: ^1.0.1
      

使用方法

一次性扫描

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

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _scanBarcode = 'Unknown';

  Future<void> scanBarcodeNormal() async {
    String barcodeScanRes;
    try {
      barcodeScanRes = await FlutterBarcodeReader.scanBarcode(
          '#ff6666', 'Cancel', true, ScanMode.BARCODE);
      print(barcodeScanRes);
    } on PlatformException {
      barcodeScanRes = 'Failed to get platform version.';
    }

    if (!mounted) return;

    setState(() {
      _scanBarcode = barcodeScanRes;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
            appBar: AppBar(title: const Text('Barcode scan')),
            body: Builder(builder: (BuildContext context) {
              return Container(
                  alignment: Alignment.center,
                  child: Column(
                      mainAxisAlignment: MainAxisAlignment.center,
                      children: <Widget>[
                        ElevatedButton(
                            onPressed: () => scanBarcodeNormal(),
                            child: Text('Start barcode scan')),
                        Text('Scan result : $_scanBarcode\n',
                            style: TextStyle(fontSize: 20))
                      ]));
            })));
  }
}

连续扫描

Future<void> startBarcodeScanStream() async {
  FlutterBarcodeReader.getBarcodeStreamReceiver(
          '#ff6666', 'Cancel', true, ScanMode.BARCODE)!
      .listen((barcode) => print(barcode));
}

示例Demo

完整的示例代码如下:

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_barcode_reader/flutter_barcode_reader.dart';

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _scanBarcode = 'Unknown';

  Future<void> startBarcodeScanStream() async {
    FlutterBarcodeReader.getBarcodeStreamReceiver(
            '#ff6666', 'Cancel', true, ScanMode.BARCODE)!
        .listen((barcode) => print(barcode));
  }

  Future<void> scanQR() async {
    String barcodeScanRes;
    try {
      barcodeScanRes = await FlutterBarcodeReader.scanBarcode(
          '#ff6666', 'Cancel', true, ScanMode.QR);
      print(barcodeScanRes);
    } on PlatformException {
      barcodeScanRes = 'Failed to get platform version.';
    }

    if (!mounted) return;

    setState(() {
      _scanBarcode = barcodeScanRes;
    });
  }

  Future<void> scanBarcodeNormal() async {
    String barcodeScanRes;
    try {
      barcodeScanRes = await FlutterBarcodeReader.scanBarcode(
          '#ff6666', 'Cancel', true, ScanMode.BARCODE);
      print(barcodeScanRes);
    } on PlatformException {
      barcodeScanRes = 'Failed to get platform version.';
    }

    if (!mounted) return;

    setState(() {
      _scanBarcode = barcodeScanRes;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
            appBar: AppBar(title: const Text('Barcode scan')),
            body: Builder(builder: (BuildContext context) {
              return Container(
                  alignment: Alignment.center,
                  child: Column(
                      mainAxisAlignment: MainAxisAlignment.center,
                      children: <Widget>[
                        ElevatedButton(
                            onPressed: () => scanBarcodeNormal(),
                            child: Text('Start barcode scan')),
                        ElevatedButton(
                            onPressed: () => scanQR(),
                            child: Text('Start QR scan')),
                        ElevatedButton(
                            onPressed: () => startBarcodeScanStream(),
                            child: Text('Start barcode scan stream')),
                        Text('Scan result : $_scanBarcode\n',
                            style: TextStyle(fontSize: 20))
                      ]));
            })));
  }
}

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

1 回复

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


当然,以下是一个关于如何在Flutter应用中使用flutter_barcode_reader插件进行条码扫描的示例代码。这个插件允许你通过设备的摄像头扫描条码并获取条码数据。

首先,你需要在你的pubspec.yaml文件中添加flutter_barcode_reader依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_barcode_reader: ^2.0.0  # 请检查最新版本号

然后运行flutter pub get来获取依赖。

接下来,在你的Flutter项目中,你可以按照以下步骤使用flutter_barcode_reader插件:

  1. 导入必要的包
import 'package:flutter/material.dart';
import 'package:flutter_barcode_reader/flutter_barcode_reader.dart';
  1. 创建一个扫描条码的按钮
void main() {
  runApp(MyApp());
}

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

  Future<void> _scanBarcode() async {
    String result = await FlutterBarcodeReader.scanBarcode(
      '#ff6666', // 矩形框的颜色(可选)
      '取消', // 取消按钮的文本(可选)
      true, // 是否震动(可选)
      true, // 是否发出声音(可选)
      false, // 是否强制全屏(可选)
    );

    // 处理扫描结果
    if (result != null) {
      // 显示扫描结果
      showDialog(
        context: context,
        builder: (context) => AlertDialog(
          title: Text('扫描结果'),
          content: Text(result),
          actions: <Widget>[
            ElevatedButton(
              onPressed: () => Navigator.of(context).pop(),
              child: Text('确定'),
            ),
          ],
        ),
      );
    } else {
      // 用户取消扫描
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('条码扫描已取消')),
      );
    }
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个按钮,点击该按钮会启动条码扫描功能。扫描完成后,会显示一个对话框,显示扫描到的条码内容。如果用户取消扫描,则会显示一个Snackbar提示。

注意事项

  • 确保在真实设备上测试条码扫描功能,因为模拟器通常不支持摄像头操作。
  • 在实际使用中,你可能需要根据项目需求对扫描界面和结果处理进行进一步的自定义。

这个示例提供了一个基本的框架,你可以在此基础上进行扩展和优化,以满足你的特定需求。

回到顶部