Flutter二维码账单生成插件qr_bill的使用

Flutter二维码账单生成插件qr_bill的使用

二维码账单库是一个用于开发瑞士支付二维码账单和支付单据的Flutter库。以下是该库的基本功能和使用方法。

示例二维码账单支付单据

功能

该库由三个类组成:

  • QRBill:这个类主要用于存储和传输二维码账单数据,类似于一个POJO(Plain Old Java Object)。此外,该类还可以验证包含的数据是否符合瑞士支付标准(当前版本为2.2)。

  • QRGenerator:此类允许生成实际的二维码图像,用于二维码账单,但不包括支付单据。输入为QRBill对象,输出可以是Widget或PNG二进制数据。

  • BillGenerator:此类将生成完整的格式化二维码账单支付单据,并以PNG二进制数据的形式输出单个二维码账单,或者以PDF文档形式输出多个二维码账单(每页一个)。输入为单个二维码账单的QRBill对象,对于PDF文档则为QRBill列表。支持的语言有英语、德语、法语和意大利语。

使用方法

通常情况下,QRBill 类必须始终被导入,因为它作为输入与其他两个类一起使用——QRGenerator(用于生成二维码)或BillGenerator(用于生成支付单据/发票)。

生成二维码账单Widget

import 'package:flutter/material.dart';
import 'package:qr_bill/qr_bill.dart';
import 'package:qr_bill/qr_generator.dart';

// 获取二维码账单Widget
Future<Widget> getQRBillWidget(String rawQrCode, double size) async {
  // 创建QRBill实例
  QRBill qrBill = QRBill(data: rawQrCode);
  Widget? qrWidget;
  
  // 验证二维码数据是否有效
  if (qrBill.isValid()) {
    // 创建QRGenerator实例
    QRGenerator qr = QRGenerator(qrBill);
    // 获取二维码Widget
    qrWidget = await qr.getWidget(size: size);
  }

  // 如果二维码数据无效,则返回错误提示
  if (qrWidget == null) {
    return SizedBox(
      width: size,
      height: size,
      child: const Center(child: Text("QR数据格式错误!")),
    );
  } else {
    return qrWidget;
  }
}

输出包含多个二维码支付单据的PDF文档

import 'package:qr_bill/qr_bill.dart';
import 'package:qr_bill/bill_generator.dart';

// 获取包含多个二维码支付单据的PDF文档
Future<File?> getInvoicesBinary(List<QRBill> qrBills, File fileToWrite) async {
  // 创建BillGenerator实例并设置语言为德语
  BillGenerator bills = BillGenerator(language: BillGenerator.german);
  // 生成包含多个二维码支付单据的PDF文档
  Uint8List? bill = await bills.generateInvoices(qrBills);
  // 将PDF文档写入文件
  return bill == null ? null : await fileToWrite.writeAsBytes(bill);
}

快速API参考

QRBill

  • QRBill QRBill({String data = ""}):基本构造函数。
  • QRBill QRBill.fromJson(Map<String, dynamic> json):从JSON格式反序列化QRBill对象。
  • Map<String, dynamic> toJson():将QRBill对象序列化为JSON格式。
  • String toString():返回QRBill对象的原始字符串,用于二维码。
  • bool isValid():返回QRBill是否严格遵循规范。
  • List<QRBillException> qrExceptions:如果QRBill不严格遵循规范,则返回错误列表,否则返回空列表。
  • 包含了众多用于各种瑞士QR账单属性的getter和setter。

QRGenerator

  • QRGenerator QRGenerator(QRBill data):基本构造函数。
  • Future<Widget?> getWidget({required double size, double margin = 0.05}):通过构造函数输出单个二维码作为Flutter Widget。
  • Future<ByteData?> getBinary({required double size, double margin = 0.05}):通过构造函数输出单个二维码的二进制数据(PNG格式)。
  • void drawCanvas(Canvas c, {double margin = 0.0, required double size, Offset offset = const Offset(0.0, 0.0)}):通过构造函数将单个二维码绘制到画布上。主要由BillGenerator使用。

BillGenerator

  • BillGenerator BillGenerator({BillGenerator language = BillGenerator.english}):基本构造函数。还设置了要使用的语言。
  • Future<Uint8List?> getBinary(QRBill qrBill):输出单个瑞士QR账单支付单据的二进制数据(PNG格式)。
  • Future<Widget?> getWidget(QRBill qrBill):根据给定的QRBill对象生成并返回瑞士QR账单支付单据的Widget版本。
  • Future<List<Widget?>> getWidgets(List<QRBill> qrBills):根据输入的QRBill对象列表生成并返回瑞士QR账单支付单据的Widget列表。
  • Future<Uint8List?> generateInvoices(List<QRBill> qrBills):输出给定QRBill的瑞士QR账单支付单据的二进制数据,以PDF格式输出,每页一个。

完整示例

以下是在Dart项目中如何使用qr_bill插件的完整示例:

import 'package:flutter/material.dart';
import 'package:qr_bill/qr_bill.dart';
import 'package:qr_bill/bill_generator.dart';

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

class QrBillExample extends StatefulWidget {
  const QrBillExample({Key? key}) : super(key: key);

  [@override](/user/override)
  State<QrBillExample> createState() => _QrBillExampleState();
}

class _QrBillExampleState extends State<QrBillExample> {
  Widget? qr = null;

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

  Future<void> _getQR() async {
    // 创建QRBill实例
    QRBill qrBill = QRBill();
    
    // 设置账单信息
    qrBill.setIBAN("CH4431999123000889012");
    qrBill.setActor(
        typeId: QRBill.actorUCR,
        addressType: QRBill.addTypeStructured,
        name: "Max Muster & Söhne",
        address1: "Musterstrasse",
        address2: "123",
        postalcode: "8000",
        location: "Seldwyla",
        country: "CH");
    qrBill.setActor(
        typeId: QRBill.actorUDR,
        addressType: QRBill.addTypeStructured,
        name: "Sandro Bellucci",
        address1: "Musterstrasse",
        address2: "1",
        postalcode: "8000",
        location: "Seldwyla",
        country: "CH");
    qrBill.setAlternativeSchema(schemas: [
      "Name AV1: UV;UltraPay005;12345",
      "Name AV2: XY;XYService;54321"
    ]);
    qrBill.setAmount(1949.75);
    qrBill.setReference(QRBill.refTypeQRR, "210000000003139471430009017");
    qrBill.setAdditionalInfo(
        "//S1/10/1234/11/201021/30/102673386/32/7.7/40/0:30");

    // 创建BillGenerator实例并设置语言为德语
    BillGenerator qrGen = BillGenerator(language: BillGenerator.german);
    // 生成二维码账单Widget
    qr = await (qrGen.getWidget(qrBill));
    setState(() {});
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Center(child: qr ?? Container());
  }
}

更多关于Flutter二维码账单生成插件qr_bill的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


当然,关于在Flutter中使用qr_bill插件来生成二维码账单,以下是一个简单的代码示例,展示了如何集成和使用这个插件。qr_bill插件主要用于生成符合瑞士支付标准的QR账单二维码。

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

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

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

接下来,在你的Flutter应用中,你可以按照以下步骤生成一个QR账单二维码:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('QR Bill Generator'),
        ),
        body: Center(
          child: QRBillExample(),
        ),
      ),
    );
  }
}

class QRBillExample extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // QR账单所需的数据
    final billData = Bill(
      account: Account(
        iban: 'CH93 0076 2011 6238 5295 7',
        creditor: Creditor(
          name: 'John Doe',
          address: Address(
            street: 'Main Street 123',
            postalCode: '1234',
            city: 'Anytown',
            country: 'CH',
          ),
        ),
      ),
      amount: 100.0,
      currency: 'CHF',
      reference: '210000000000003139120009017',
      message: 'This is a test payment',
    );

    // 生成QR账单
    final qrBill = billData.toQrBill();

    // 将QR账单转换为图像
    final qrImage = QrImage(
      data: qrBill.qrCodeData,
      version: QrVersions.auto,
      size: 256,
    );

    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Image.memory(qrImage.bytes),
        SizedBox(height: 20),
        Text('QR Bill Data:\n${billData.toJson()}'),
      ],
    );
  }
}

在上面的代码中,我们创建了一个Bill对象,其中包含生成QR账单所需的所有信息,如账户详情、金额、货币、参考号和消息。然后,我们调用toQrBill()方法生成QR账单对象,并使用QrImage类将其转换为图像。

注意,QrImage类可能需要额外的依赖项,例如qr_flutter,来实际渲染二维码图像。如果你遇到任何问题,请确保查看qr_bill插件的文档以获取最新的使用指南和依赖项信息。

此外,billData.toJson()方法用于将账单数据转换为JSON字符串,仅用于调试和显示目的,在实际应用中可能不需要。

这个示例应该能够帮助你快速上手使用qr_bill插件来生成二维码账单。如果你有更多定制需求,建议查阅qr_bill插件的官方文档以获取更多信息和高级用法。

回到顶部