Flutter条形码扫描插件learning_barcode_scanning的使用

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

Flutter条形码扫描插件learning_barcode_scanning的使用

通过使用Flutter的learning_barcode_scanning插件,我们可以轻松地在应用程序中实现条形码扫描功能。该插件允许我们读取大多数标准条形码格式的数据,如Codabar、Code 39、Code 128等。

支持的格式

  • 线性条形码: Codabar, Code 39, Code 93, Code 128, EAN-8, EAN-13, ITF, UPC-A, UPC-E
  • 二维条形码: Aztec, Data Matrix, PDF417, QR Code

条形码扫描示例

开始使用

首先,在你的Flutter项目中添加依赖项:

$ flutter pub add learning_barcode_scanning

或者在pubspec.yaml文件中添加以下内容:

dependencies:
  learning_barcode_scanning: ^0.0.2

然后运行flutter pub get以获取新的依赖项。

使用

导入必要的包:

import 'package:learning_barcode_scanning/learning_barcode_scanning.dart';

输入图像

与其它ML视觉插件一样,输入数据是通过InputImage实例提供的,它是learning_input_image包的一部分。

你可以使用InputCameraView小部件从相机或存储中获取图像流,并将其转换为InputImage格式。以下是如何使用InputCameraView来获取用于条形码扫描的InputImage的示例:

import 'package:learning_input_image/learning_input_image.dart';

InputCameraView(
  title: 'Barcode Scanning',
  onImage: (InputImage image) {
    // 现在我们可以将输入图像传递给条形码扫描器
  },
)

条形码扫描

获取到InputImage后,可以通过调用BarcodeScanner实例上的scan方法来开始扫描条形码。

BarcodeScanner scanner = BarcodeScanner(formats: [
  BarcodeFormat.QR_CODE,
  BarcodeFormat.CODE_128,
  BarcodeFormat.CODE_39,
  BarcodeFormat.CODE_93,
  BarcodeFormat.EAN_13,
  BarcodeFormat.EAN_8,
  BarcodeFormat.ITF,
  BarcodeFormat.UPC_A,
  BarcodeFormat.UPC_E,
  BarcodeFormat.CODABAR,
  BarcodeFormat.DATA_MATRIX,
  BarcodeFormat.PDF417
]);

List result = await scanner.scan(image);

输出

条形码扫描的结果是一个包含多个Barcode对象的列表,这些对象根据其类型分为不同的子类。

以下是Barcode对象的一般数据结构:

BarcodeType type // 条形码对象的类型
String value // 条形码内部的原始值
Rect? boundingBox // 条形码在图像中的边界框
List<Offset> corners // 表示条形码角点位置的点列表

以下是BarcodeType值及其对应的Barcode对象列表。每个Barcode对象都是Barcode的直接子类。

释放资源

在不再使用BarcodeScanner时,需要调用dispose方法释放资源:

scanner.dispose();

示例项目

你可以在这里查看完整的示例项目。

import 'package:flutter/material.dart';
import 'package:learning_barcode_scanning/learning_barcode_scanning.dart';
import 'package:learning_input_image/learning_input_image.dart';
import 'package:provider/provider.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.lightBlue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
        primaryTextTheme: TextTheme(headline6: TextStyle(color: Colors.white)),
      ),
      home: ChangeNotifierProvider(
        create: (_) => BarcodeScanningState(),
        child: BarcodeScanningPage(),
      ),
    );
  }
}

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

class _BarcodeScanningPageState extends State<BarcodeScanningPage> {
  BarcodeScanningState get state => Provider.of(context, listen: false);

  BarcodeScanner _scanner = BarcodeScanner(formats: [
    BarcodeFormat.QR_CODE,
    BarcodeFormat.CODE_128,
    BarcodeFormat.CODE_39,
    BarcodeFormat.CODE_93,
    BarcodeFormat.EAN_13,
    BarcodeFormat.EAN_8,
    BarcodeFormat.ITF,
    BarcodeFormat.UPC_A,
    BarcodeFormat.UPC_E,
    BarcodeFormat.CODABAR,
    BarcodeFormat.DATA_MATRIX,
    BarcodeFormat.PDF417
  ]);

  [@override](/user/override)
  void dispose() {
    _scanner.dispose();
    super.dispose();
  }

  Future<void> _scan(InputImage image) async {
    if (state.isNotProcessing) {
      state.startProcessing();
      state.image = image;
      state.data = await _scanner.scan(image);
      state.stopProcessing();
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return InputCameraView(
      mode: InputCameraMode.gallery,
      cameraDefault: InputCameraType.rear,
      title: 'Barcode Scanning',
      onImage: _scan,
      overlay: Consumer<BarcodeScanningState>(
        builder: (_, state, __) {
          if (state.isEmpty) {
            return Container();
          }

          return Center(
            child: Container(
              padding: EdgeInsets.symmetric(vertical: 10, horizontal: 16),
              decoration: BoxDecoration(
                color: Colors.white.withOpacity(0.8),
                borderRadius: BorderRadius.all(Radius.circular(4.0)),
              ),
              child: Text(
                state.toString(),
                style: TextStyle(
                  fontWeight: FontWeight.w500,
                ),
              ),
            ),
          );
        },
      ),
    );
  }
}

class BarcodeScanningState extends ChangeNotifier {
  InputImage? _image;
  List _data = [];
  bool _isProcessing = false;

  InputImage? get image => _image;
  List get data => _data;

  String? get type => _image?.type;
  InputImageRotation? get rotation => _image?.metadata?.rotation;
  Size? get size => _image?.metadata?.size;

  bool get isProcessing => _isProcessing;
  bool get isNotProcessing => !_isProcessing;
  bool get isEmpty => _data.isEmpty;

  void startProcessing() {
    _isProcessing = true;
    notifyListeners();
  }

  void stopProcessing() {
    _isProcessing = false;
    notifyListeners();
  }

  set isProcessing(bool isProcessing) {
    _isProcessing = isProcessing;
    notifyListeners();
  }

  set image(InputImage? image) {
    _image = image;
    notifyListeners();
  }

  set data(List data) {
    _data = data;
    notifyListeners();
  }

  [@override](/user/override)
  String toString() {
    if (_data.first is Barcode) {
      return _data.first.value;
    }

    return '';
  }
}

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

1 回复

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


当然,下面是一个关于如何在Flutter应用中使用learning_barcode_scanning插件来实现条形码扫描功能的代码示例。这个示例将展示如何设置插件、请求相机权限以及扫描条形码。

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

dependencies:
  flutter:
    sdk: flutter
  learning_barcode_scanning: ^0.x.x  # 请替换为最新版本号

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

接下来,是主要的Dart代码示例:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: BarcodeScannerScreen(),
    );
  }
}

class BarcodeScannerScreen extends StatefulWidget {
  @override
  _BarcodeScannerScreenState createState() => _BarcodeScannerScreenState();
}

class _BarcodeScannerScreenState extends State<BarcodeScannerScreen> {
  String? scannedResult;

  Future<void> _scanBarcode() async {
    try {
      // 请求相机权限
      final bool hasPermission = await Permission.camera.request().isGranted;
      if (!hasPermission) {
        setState(() {
          scannedResult = 'Camera permission is required to scan barcode.';
        });
        return;
      }

      // 启动条形码扫描
      final BarcodeScanResult? result = await BarcodeScanner.scan();
      if (result != null) {
        setState(() {
          scannedResult = 'Barcode: ${result.rawContent} | Format: ${result.format}';
        });
      } else {
        setState(() {
          scannedResult = 'Failed to scan barcode.';
        });
      }
    } catch (e) {
      setState(() {
        scannedResult = 'Error scanning barcode: $e';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Barcode Scanner Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              scannedResult ?? 'Press the button to scan a barcode.',
              style: TextStyle(fontSize: 20),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _scanBarcode,
              child: Text('Scan Barcode'),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. 请求相机权限:使用Permission.camera.request()来请求相机权限。如果用户没有授予权限,我们显示一个错误消息。

  2. 启动条形码扫描:使用BarcodeScanner.scan()方法来启动条形码扫描。这个方法返回一个BarcodeScanResult对象,包含扫描到的条形码内容和格式。

  3. 显示扫描结果:扫描结果将显示在屏幕上。

注意:

  • 确保在Android和iOS项目中正确配置了相机权限。
  • 根据learning_barcode_scanning插件的文档,可能还需要进行一些额外的配置,例如iOS的Info.plist文件设置等。

这个示例应该能帮助你快速上手在Flutter应用中使用learning_barcode_scanning插件来实现条形码扫描功能。

回到顶部