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

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

简介

Barcode-Kit 是一个用于在 Flutter 应用中通过摄像头读取条形码的插件。它利用了 Google ML Kit 和 iOS Vision 技术来实现条形码扫描功能。

Banner

文档

Pub 包

功能展示

Demo

概述

Barcode-Kit 是一个 Flutter 插件,允许用户通过摄像头读取条形码。它使用原生纹理来显示摄像头画面,并提供了条形码的覆盖层。该插件基于 Google ML Kit 和 iOS Vision 实现条形码扫描。

前置条件

  • 安装了 Flutter SDK。
  • 具备 Flutter 开发经验。

安装

通过以下命令将 mtrust_barcode_kit 添加到您的 Flutter 项目:

flutter pub add mtrust_barcode_kit

或者手动添加到 pubspec.yaml 文件中:

dependencies:
  mtrust_barcode_kit: ^2.0.2

使用示例

以下是一个完整的使用示例,展示了如何在 Flutter 应用中集成 Barcode-Kit 插件。

示例代码

import 'package:mtrust_barcode_kit/mtrust_barcode_kit.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

// 自定义 UI 构建器
class _Ui extends BarcodeKitUiBuilder {
  [@override](/user/override)
  Widget buildCameraNotAvailable(BuildContext context) {
    return const Stack(
      children: [
        Center(
          child: Text("Camera not available"),
        )
      ],
    );
  }

  [@override](/user/override)
  Widget buildCameraNotOpened(BuildContext context) {
    return const Stack(
      children: [
        Center(
          child: CircularProgressIndicator(),
        )
      ],
    );
  }

  [@override](/user/override)
  Widget buildNoPermission(
      BuildContext context, Function() onSettingsRequested) {
    return Stack(
      children: [
        Center(
          child: Column(
            mainAxisSize: MainAxisSize.min,
            children: [
              const Text("No permissions granted"),
              ElevatedButton(
                onPressed: () async {
                  onSettingsRequested();
                },
                child: const Text("Open settings"),
              )
            ],
          ),
        )
      ],
    );
  }

  [@override](/user/override)
  Widget buildRequestPermission(
      BuildContext context, Function() onPermissionRequested) {
    return Stack(
      children: [
        Center(
          child: Column(
            mainAxisSize: MainAxisSize.min,
            children: [
              const Text("We need permissions to use the camera"),
              ElevatedButton(
                onPressed: () async {
                  onPermissionRequested();
                },
                child: const Text("Request permissions"),
              )
            ],
          ),
        )
      ],
    );
  }
}

void main() {
  runApp(const MaterialApp(
    home: BarcodeKitDemo(),
  ));
}

class BarcodeKitDemo extends StatefulWidget {
  const BarcodeKitDemo({
    super.key,
  });

  [@override](/user/override)
  State<BarcodeKitDemo> createState() => _BarcodeKitDemoState();
}

class _BarcodeKitDemoState extends State<BarcodeKitDemo> {
  bool _paused = false;
  bool _rotate = false;
  bool _ocr = false;
  final Set<BarcodeFormat> _formats = {BarcodeFormat.dataMatrix};

  final List<DetectedBarcode> _barcodes = [];
  final List<String> _texts = [];

  void _onTextDetected(String text) {
    setState(() {
      _texts.add(text);
    });
  }

  void _onBarcodeScanned(DetectedBarcode barcode) {
    setState(() {
      _paused = true;
    });

    setState(() {
      _barcodes.add(barcode);
    });

    HapticFeedback.mediumImpact();

    ScaffoldMessenger.of(context).showSnackBar(
      SnackBar(
        content: Text(
          "Scanned barcode ${barcode.rawValue?.substring(0, 10)} ${barcode.format}",
        ),
      ),
    );
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      extendBodyBehindAppBar: true,
      body: BarcodeKitView(
        formats: _formats,
        cameraFit: BoxFit.cover,
        maskHeight: 200,
        maskWidth: 200,
        onTextDetected: _onTextDetected,
        widgetAboveMask: Center(
          child: Text(
            "Look for the barcode",
            style: Theme.of(context)
                .textTheme
                .headlineMedium!
                .copyWith(color: Colors.white),
          ),
        ),
        widgetBelowMask: Center(
          child: Text(
            "Approach barcode with camera 📸",
            style: Theme.of(context)
                .textTheme
                .bodyLarge!
                .copyWith(color: Colors.white),
          ),
        ),
        paused: _paused,
        maskAdditionpauseOpacity: 0.2,
        enableOCR: _ocr,
        followRotation: _rotate,
        onBarcodeScanned: (barcode) {
          _onBarcodeScanned(barcode);
        },
        uiBuilder: _Ui(),
      ),
      bottomNavigationBar: Container(
        decoration: const BoxDecoration(color: Colors.white),
        padding: const EdgeInsets.symmetric(vertical: 16.0, horizontal: 8.0),
        child: SafeArea(
          child: Row(
            children: [
              ElevatedButton(
                child: _paused ? const Text("Start Scan") : const Text("Pause"),
                onPressed: () {
                  setState(() {
                    _paused = !_paused;
                  });
                },
              ),
              const Spacer(),
              Text(_texts.lastOrNull ?? ""),
              IconButton(
                icon: Icon(_rotate
                    ? Icons.screen_rotation
                    : Icons.screen_lock_rotation),
                onPressed: () {
                  setState(() {
                    _rotate = !_rotate;
                  });
                },
              ),
              IconButton(
                icon: Icon(_ocr ? Icons.text_format : Icons.text_decrease),
                onPressed: () {
                  setState(() {
                    _ocr = !_ocr;
                  });

                  if (_ocr) {
                    ScaffoldMessenger.of(context).clearSnackBars();
                    ScaffoldMessenger.of(context).showSnackBar(
                      const SnackBar(
                        content: Text(
                          "OCR enabled",
                        ),
                      ),
                    );
                  } else {
                    ScaffoldMessenger.of(context).clearSnackBars();
                    ScaffoldMessenger.of(context).showSnackBar(
                      const SnackBar(
                        content: Text(
                          "OCR disabled",
                        ),
                      ),
                    );
                  }
                },
              ),
              IconButton(
                onPressed: () {
                  Navigator.of(context).push(MaterialPageRoute(
                      builder: (context) => _Settings(
                            formats: _formats,
                            onFormatsChanged: (formats) {
                              setState(() {});
                            },
                          )));
                },
                icon: const Icon(Icons.settings),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

class _Settings extends StatefulWidget {
  final Set<BarcodeFormat> formats;
  final Function(Set<BarcodeFormat>) onFormatsChanged;

  const _Settings({
    required this.formats,
    required this.onFormatsChanged,
  });

  [@override](/user/override)
  State<_Settings> createState() => _SettingsState();
}

class _SettingsState extends State<_Settings> {
  Set<BarcodeFormat> _formats = {};

  [@override](/user/override)
  void initState() {
    _formats = widget.formats;
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Settings"),
      ),
      body: ListView(
        children: BarcodeFormat.values
            .map(
              (e) => CheckboxListTile(
                title: Text(e.toString()),
                value: _formats.contains(e),
                onChanged: (value) {
                  setState(() {
                    if (value == false) {
                      _formats.remove(e);
                    } else {
                      _formats.add(e);
                    }
                  });
                  widget.onFormatsChanged(_formats);
                },
              ),
            )
            .toList(),
      ),
    );
  }
}

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

1 回复

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


mtrust_barcode_kit 是一个用于 Flutter 应用程序的条形码扫描插件。它允许你在 Flutter 应用中集成条形码扫描功能。以下是如何在 Flutter 项目中使用 mtrust_barcode_kit 插件的步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 mtrust_barcode_kit 插件的依赖。

dependencies:
  flutter:
    sdk: flutter
  mtrust_barcode_kit: ^1.0.0  # 请确保使用最新版本

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

2. 配置 Android 和 iOS 项目

Android 配置

android/app/build.gradle 文件中,确保 minSdkVersion 至少为 21:

android {
    defaultConfig {
        minSdkVersion 21
        // 其他配置
    }
    // 其他配置
}

iOS 配置

ios/Podfile 文件中,确保 platform :ios 的版本至少为 9.0:

platform :ios, '9.0'

然后运行 pod install 来更新 iOS 项目的依赖。

3. 使用插件进行条形码扫描

在你的 Flutter 代码中,你可以使用 mtrust_barcode_kit 插件来启动条形码扫描并获取扫描结果。

import 'package:flutter/material.dart';
import 'package:mtrust_barcode_kit/mtrust_barcode_kit.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 _barcodeResult = 'Scan a barcode';

  Future<void> _scanBarcode() async {
    try {
      final String barcode = await MtrustBarcodeKit.scanBarcode();
      setState(() {
        _barcodeResult = barcode;
      });
    } catch (e) {
      setState(() {
        _barcodeResult = 'Failed to scan barcode: $e';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Barcode Scanner'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(_barcodeResult),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _scanBarcode,
              child: Text('Scan Barcode'),
            ),
          ],
        ),
      ),
    );
  }
}

4. 运行应用

现在你可以运行你的 Flutter 应用,点击“Scan Barcode”按钮来启动条形码扫描。扫描结果将显示在屏幕上。

5. 处理权限

在 Android 和 iOS 上,条形码扫描通常需要相机权限。确保你在应用中正确处理了相机权限。

Android

AndroidManifest.xml 中添加相机权限:

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

iOS

Info.plist 中添加相机权限描述:

<key>NSCameraUsageDescription</key>
<string>We need access to your camera to scan barcodes</string>
回到顶部