Flutter条形码读取插件barcode_reader_webassembly的使用

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

Flutter条形码读取插件barcode_reader_webassembly的使用

本项目是项目的包装器:Barcode Read - Ts 和 Webassembly

开始使用

您需要使用两种方法来读取条形码。

方法表

方法 描述
readBarcodeFromStack 此方法接收一个ReadBarcodeProps,并将请求插入到请求堆栈中。这在您在同一时间进行多次条形码读取时非常有用。
readBarcode 此方法接收一个ReadBarcodeProps并执行简单的读取。

关于ReadBarcodeProps

属性 类型 描述
file (可选) boolean 与pdf文件相关的文件。
filePath (可选) boolean 与pdf文件相关的url。
scale (可选) boolean 在搜索条形码之前应用于pdf文档的比例或缩放。
sequenceNum (可选) Number 当处理多个条形码时,图像的序列号。
password (可选) String 打开pdf文件的密码。

完整示例代码

import 'dart:async';

import 'package:barcode_reader_webassembly/barcode_reader_webassembly_constants.dart';
import 'package:barcode_reader_webassembly/barcode_reader_webassembly_plugin.dart';
import 'package:flutter/material.dart';
import 'package:universal_html/html.dart';

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

class BarcodeReaderWebassemblyExampleApp extends StatelessWidget {
  const BarcodeReaderWebassemblyExampleApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: 'BarcodeReaderWebassembly Example',
      home: Scaffold(
        backgroundColor: Color.fromRGBO(22, 27, 34, 1),
        body: Center(
          child: BarcodeReaderWebassemblyExamplePage(
            title: 'BarcodeReaderWebassembly Example Home Page',
          ),
        ),
      ),
    );
  }
}

class BarcodeReaderWebassemblyExamplePage extends StatefulWidget {
  const BarcodeReaderWebassemblyExamplePage({
    Key? key,
    required this.title,
  }) : super(key: key);
  final String title;

  [@override](/user/override)
  State<BarcodeReaderWebassemblyExamplePage> createState() => _BarcodeReaderWebassemblyExamplePageState();
}

class _BarcodeReaderWebassemblyExamplePageState extends State<BarcodeReaderWebassemblyExamplePage> {
  final _barcodeReaderWebassemblyPlugin = BarcodeReaderWebassemblyPlugin();

  bool isProcessing = false;
  String result = '';
  String password = '';

  void _uploadFile(File file) async {
    setState(() {
      isProcessing = true;
    });

    final barcodeProps = ReadBarcodeProps(file);
    barcodeProps.onRequiredPassword = _onRequiredPassword;
    final barcode = await _barcodeReaderWebassemblyPlugin.readBarcodeFromStack(barcodeProps);
    setState(() {
      result = barcode;
      isProcessing = false;
    });
  }

  void _selectFile() {
    InputElement uploadInput = FileUploadInputElement() as InputElement;
    uploadInput.draggable = true;
    uploadInput.multiple = false;
    uploadInput.accept = "image/*','application/pdf";
    uploadInput.click();

    uploadInput.onChange.listen((e) {
      File file = uploadInput.files![0];
      _uploadFile(file);
    });
  }

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

  Future<String> _onRequiredPassword() {
    final completer = Completer<String>();
    showDialog(
      context: context,
      builder: (BuildContext context) {
        return AlertDialog(
          title: const Text('请输入pdf密码。'),
          content: TextField(
            obscureText: true,
            decoration: const InputDecoration(
              hintText: '输入密码',
            ),
            onChanged: (value) {
              setState(() {
                password = value;
              });
            },
          ),
          actions: <Widget>[
            ElevatedButton(
              child: const Text('确认'),
              onPressed: () {
                completer.complete(password);
                Navigator.of(context).pop();
              },
            ),
          ],
        );
      },
    );
    return completer.future;
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        ElevatedButton(
          style: ButtonStyle(
            backgroundColor: MaterialStateProperty.all(Colors.blue),
            overlayColor: MaterialStateProperty.all(
              isProcessing ? Colors.black : Colors.transparent,
            ),
            padding: MaterialStateProperty.all(
              const EdgeInsets.all(15),
            ),
          ),
          onPressed: () => _selectFile(),
          child: const Text(
            "选择文件",
            style: TextStyle(fontSize: 15, color: Colors.white),
          ),
        ),
        Padding(
          padding: const EdgeInsets.only(top: 20),
          child: Text(
            isProcessing ? '正在处理...' : result,
            style: const TextStyle(fontSize: 20, color: Colors.white),
          ),
        )
      ],
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用barcode_reader_webassembly插件来读取条形码的示例代码。这个插件允许你在Flutter应用中通过WebAssembly来读取条形码。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  barcode_reader_webassembly: ^x.y.z  # 请替换为最新版本号

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

2. 导入插件

在你的Dart文件中导入插件:

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

3. 创建一个简单的Flutter应用来读取条形码

以下是一个完整的示例,展示如何使用barcode_reader_webassembly插件来读取条形码并显示结果:

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

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

class BarcodeScannerPage extends StatefulWidget {
  @override
  _BarcodeScannerPageState createState() => _BarcodeScannerPageState();
}

class _BarcodeScannerPageState extends State<BarcodeScannerPage> {
  String? result;

  Future<void> scanBarcode(File imageFile) async {
    try {
      final barcodeResult = await BarcodeReaderWebAssembly.scanBarcode(imageFile.path);
      setState(() {
        result = barcodeResult.text;
      });
    } catch (e) {
      print("Barcode scanning error: $e");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Barcode Scanner'),
      ),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Image.network(
            'https://example.com/barcode-image.png', // 替换为你的条形码图片URL
            width: 300,
            height: 500,
            onTap: () async {
              // 假设你已经通过某种方式获取了图片文件
              // 这里为了演示,我们使用一个网络图片URL,实际中你应该使用FilePicker等插件来选择本地图片
              // 这里只是演示逻辑,所以直接调用scanBarcode,实际中需要获取File对象
              final imageFile = File('path/to/your/local/barcode/image.png'); // 替换为你的本地图片路径
              await scanBarcode(imageFile);
            },
          ),
          SizedBox(height: 20),
          if (result != null)
            Text(
              'Barcode: $result',
              style: TextStyle(fontSize: 24),
            ),
        ],
      ),
    );
  }
}

注意

  1. 图片获取:在实际应用中,你可能需要从设备存储中选择图片,可以使用image_picker等插件来实现。
  2. 权限处理:如果从设备存储中选择图片,需要处理相关权限问题。
  3. 路径处理:确保你传递给scanBarcode方法的路径是有效的本地文件路径。

4. 运行应用

确保你已经正确设置了所有依赖和代码,然后运行你的Flutter应用:

flutter run

这个示例代码展示了如何在Flutter应用中使用barcode_reader_webassembly插件来读取条形码。实际项目中,你可能需要根据具体需求进行更多的调整和扩展。

回到顶部