Flutter打印机控制插件devla_sunmi的使用

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

Flutter打印机控制插件devla_sunmi的使用

概述

devla_sunmi 是一个用于控制 Sunmi 打印机的 Flutter 插件。该插件支持 Sunmi V2 Pro 和其标签版本,并且符合 Null Safety 标准。本插件基于官方文档构建,但并非所有方法都包含在内,仅选择了几个重要的方法以满足个人使用场景。


安装

要将 devla_sunmi 添加到您的项目中,请运行以下命令:

flutter pub add devla_sunmi

支持设备

该插件支持以下设备:

  • Sunmi V2 Pro
  • Sunmi V2 Pro (标签版本)

使用步骤

在使用插件之前,确保绑定打印机服务。以下是基本的初始化步骤:

// 导入包
import 'package:devla_sunmi/devla_sunmi.dart';

// 绑定打印机服务
await SunmiPrinter.bindingPrinter();

常用功能列表

以下是常用的功能及其描述:

方法名称 函数类型 (Future) 描述 支持设备
bindingPrinter() void 绑定打印机服务,仅需初始化一次 Sunmi v2 pro, Sunmi v2 Pro (标签版本)
unbindingPrinter() void 根据需求解除绑定打印机服务 Sunmi v2 pro, Sunmi v2 Pro (标签版本)
initPrinter() bool 初始化打印机,重置逻辑程序(如字体大小、加粗等),但不清空缓冲区数据。成功时返回 true Sunmi v2 pro, Sunmi v2 Pro (标签版本)
getPrinterStatus() enum PrinterStatus 返回打印机状态枚举值,例如 PrinterStatus.NORMALPrinterStatus.ERROR Sunmi v2 pro, Sunmi v2 Pro (标签版本)
getPrinterStatusWithVerbose() String 返回状态的详细信息或文本说明,例如 'Works normally''Something went wrong.' Sunmi v2 pro, Sunmi v2 Pro (标签版本)
getPrinterMode() enum PrinterMode 获取打印机模式。注意:打印标签时需切换为标签模式,但仅支持 V2 Pro 标签版本 Sunmi v2 pro, Sunmi v2 Pro (标签版本)
lineWrap(int lines) void 强制打印指定行数的空白行 Sunmi v2 pro, Sunmi v2 Pro (标签版本)
printText(String text) void 打印文本。注意:末尾已自动添加 \n,无需手动添加 Sunmi v2 pro, Sunmi v2 Pro (标签版本)
setAlignment(PrintAlign alignment) void 设置下一行的对齐方式,可选值:PrintAlign.LEFT, PrintAlign.CENTER, PrintAlign.RIGHT Sunmi v2 pro, Sunmi v2 Pro (标签版本)
printImage(Uint8List img) void 打印图像,需先将图像转换为 Uint8List 格式 Sunmi v2 pro, Sunmi v2 Pro (标签版本)

事务打印功能列表

事务打印允许一次性提交多个打印任务,并在完成后反馈结果。

方法名称 函数类型 (Future) 描述 支持设备
startTransactionPrint([bool clear = false]) void 进入事务打印模式,若传入 true 则清空队列并打印所有内容;否则保存内容等待下次提交 Sunmi v2 pro, Sunmi v2 Pro (标签版本)
submitTransactionPrint() void 提交事务打印任务 Sunmi v2 pro, Sunmi v2 Pro (标签版本)
exitTransactionPrint([bool clear = true]) void 退出事务打印模式,若传入 true 则清空队列并打印所有内容;否则保存内容等待下次提交 Sunmi v2 pro, Sunmi v2 Pro (标签版本)
示例代码(事务打印)
await SunmiPrinter.startTransactionPrint();
await SunmiPrinter.printText('ໃບບິນ',
    style: SunmiStyle(
        align: SunmiPrintAlign.CENTER,
        bold: true,
        fontSize: SunmiFontSize.LG));
await SunmiPrinter.printText('Paymart payrich ສາຂາ ໜອງພະຍາ',
    style: SunmiStyle(
        align: SunmiPrintAlign.CENTER,
        bold: true,
        fontSize: SunmiFontSize.MD));
await SunmiPrinter.line();

await SunmiPrinter.printRow(cols: [
  ColumnMaker(text: 'ເລກບິນ', width: 6),
  ColumnMaker(text: '1234567890', width: 6, align: SunmiPrintAlign.RIGHT),
]);

await SunmiPrinter.printRow(cols: [
  ColumnMaker(text: 'ວັນເວລາ', width: 6),
  ColumnMaker(text: '01/01/2022', width: 6, align: SunmiPrintAlign.RIGHT),
]);

await SunmiPrinter.printRow(cols: [
  ColumnMaker(text: 'ຊຳລະໂດຍ', width: 6),
  ColumnMaker(text: 'ເງິນສົດ', width: 6, align: SunmiPrintAlign.RIGHT),
]);

await SunmiPrinter.line();
await SunmiPrinter.printText('ລາຍການສິນຄ້າ',
    style: SunmiStyle(
        align: SunmiPrintAlign.CENTER,
        bold: true,
        fontSize: SunmiFontSize.MD));

await SunmiPrinter.printRow(cols: [
  ColumnMaker(text: '1. ເບຍລາວໃຫຍ່', width: 6),
  ColumnMaker(text: '2 x 120,000', width: 6, align: SunmiPrintAlign.RIGHT),
]);
await SunmiPrinter.submitTransactionPrint();
await SunmiPrinter.exitTransactionPrint();

新特性

打印条形码
await SunmiPrinter.startTransactionPrint();
await SunmiPrinter.printBarCode('987651231');
await SunmiPrinter.printText('VTE-123123-123123',
    style: SunmiStyle(
        align: SunmiPrintAlign.CENTER,
        bold: false,
        fontSize: SunmiFontSize.MD));
await SunmiPrinter.submitTransactionPrint();
await SunmiPrinter.exitTransactionPrint();
打印二维码
await SunmiPrinter.startTransactionPrint();
await SunmiPrinter.printQRCode('987651231');
await SunmiPrinter.printText('VTE-123123-123123',
    style: SunmiStyle(
        align: SunmiPrintAlign.CENTER,
        bold: false,
        fontSize: SunmiFontSize.MD));
await SunmiPrinter.submitTransactionPrint();
await SunmiPrinter.exitTransactionPrint();

标签打印注意事项

条件限制
  1. 设置模式:要启用标签打印功能,请进入设置 -> 内置打印 -> 打印模式选择 -> 选择标签热敏模式。
  2. 学习标签纸:如果是第一次使用或更换了不同类型的标签纸,请进入设置 -> 内置打印 -> 标签学习 -> 点击“学习标签纸”。
示例代码(单张标签打印)
await SunmiPrinter.startLabelPrint();
await SunmiPrinter.setAlignment(PrintAlign.CENTER);
await SunmiPrinter.printImage(img); // 将 img 转换为 Uint8List 格式
await SunmiPrinter.exitLabelPrint();
示例代码(多张标签打印)
int lastIndex = imgURLList.length - 1;

await Future.forEach(imgURLList, (String url) async {
  await SunmiPrinter.startLabelPrint();
  int index = imgURLList.indexOf(url);
  String imgUrl = 'https://example.com/image.png';
  Uint8List bytes = (await NetworkAssetBundle(Uri.parse(imgUrl)).load(imgUrl)).buffer.asUint8List();

  await SunmiPrinter.printImage(bytes);
  if (index == lastIndex) {
    await SunmiPrinter.exitLabelPrint();
  }
});

枚举列表

打印机状态枚举
enum PrinterStatus {
  ERROR,
  NORMAL, 
  ABNORMAL_COMMUNICATION, 
  OUT_OF_PAPER, 
  PREPARING,
  OVERHEATED,
  OPEN_THE_LID, 
  PAPER_CUTTER_ABNORMAL,
  PAPER_CUTTER_RECOVERED,
  NO_BLACK_MARK,
  NO_PRINTER_DETECTED,
  FAILED_TO_UPGRADE_FIRMWARE,
  EXCEPTION
}
打印机详细状态
{
  'ERROR': 'Something went wrong.', 
  'NORMAL': 'Works normally', 
  'ABNORMAL_COMMUNICATION': 'Abnormal communication',
  'OUT_OF_PAPER': 'Out of paper',
  'PREPARING': 'Preparing printer',
  'OVERHEATED': 'Overheated',
  'OPEN_THE_LID': 'Open the lid',
  'PAPER_CUTTER_ABNORMAL': 'The paper cutter is abnormal',
  'PAPER_CUTTER_RECOVERED': 'The paper cutter has been recovered',
  'NO_BLACK_MARK': 'No black mark had been detected',
  'NO_PRINTER_DETECTED': 'No printer had been detected',
  'FAILED_TO_UPGRADE_FIRMWARE': 'Failed to upgrade firmware',
  'EXCEPTION': 'Unknown Error code',
}
打印机模式枚举
enum PrinterMode {
  NORMAL_MODE,
  BLACK_LABEL_MODE, 
  LABEL_MODE
}

示例代码

以下是完整的示例代码,展示了如何使用 devla_sunmi 插件进行打印:

import 'package:flutter/material.dart';
import 'dart:async';
import 'package:devla_sunmi/flutter_sunmi_printer.dart';

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

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

  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'Sunmi Printer',
        theme: ThemeData(
          primaryColor: Colors.blue,
        ),
        debugShowCheckedModeBanner: false,
        home: const Home());
  }
}

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

  [@override](/user/override)
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  [@override](/user/override)
  void initState() {
    super.initState();
    _bindingPrinter();
  }

  Future<bool> _bindingPrinter() async {
    final bool result = await SunmiPrinter.bindingPrinter();
    return result;
  }

  void printer() async {
    await SunmiPrinter.startTransactionPrint();
    await SunmiPrinter.printText('ໃບບິນ',
        style: SunmiStyle(
            align: SunmiPrintAlign.CENTER,
            bold: true,
            fontSize: SunmiFontSize.LG));
    await SunmiPrinter.printText('Paymart payrich ສາຂາ ໜອງພະຍາ',
        style: SunmiStyle(
            align: SunmiPrintAlign.CENTER,
            bold: true,
            fontSize: SunmiFontSize.MD));
    await SunmiPrinter.printText('( Vientiane, Xaisetthar, Meuang noy )',
        style: SunmiStyle(
          align: SunmiPrintAlign.CENTER,
        ));
    await SunmiPrinter.printText('+85620 99935756',
        style: SunmiStyle(
          align: SunmiPrintAlign.CENTER,
        ));
    await SunmiPrinter.line();

    await SunmiPrinter.printRow(cols: [
      ColumnMaker(text: 'ເລກບິນ', width: 6),
      ColumnMaker(text: '1234567890', width: 6, align: SunmiPrintAlign.RIGHT),
    ]);

    await SunmiPrinter.printRow(cols: [
      ColumnMaker(text: 'ວັນເວລາ', width: 6),
      ColumnMaker(text: '01/01/2022', width: 6, align: SunmiPrintAlign.RIGHT),
    ]);

    await SunmiPrinter.printRow(cols: [
      ColumnMaker(text: 'ຊຳລະໂດຍ', width: 6),
      ColumnMaker(text: 'ເງິນສົດ', width: 6, align: SunmiPrintAlign.RIGHT),
    ]);

    await SunmiPrinter.line();
    await SunmiPrinter.printText('ລາຍການສິນຄ້າ',
        style: SunmiStyle(
            align: SunmiPrintAlign.CENTER,
            bold: true,
            fontSize: SunmiFontSize.MD));

    await SunmiPrinter.printRow(cols: [
      ColumnMaker(text: '1. ເບຍລາວໃຫຍ່', width: 6),
      ColumnMaker(text: '2 x 120,000', width: 6, align: SunmiPrintAlign.RIGHT),
    ]);
    await SunmiPrinter.printRow(cols: [
      ColumnMaker(text: '2. ເຄື່ອງດື່ມ', width: 6),
      ColumnMaker(text: '2 x 120,000', width: 6, align: SunmiPrintAlign.RIGHT),
    ]);

    await SunmiPrinter.line();
    await SunmiPrinter.printText('ສະມາຊິກ',
        style: SunmiStyle(
            align: SunmiPrintAlign.CENTER,
            bold: true,
            fontSize: SunmiFontSize.MD));

    await SunmiPrinter.printRow(cols: [
      ColumnMaker(text: 'ຊື່', width: 6),
      ColumnMaker(text: 'ວົງແກ້ວ', width: 6, align: SunmiPrintAlign.RIGHT),
    ]);
    await SunmiPrinter.printRow(cols: [
      ColumnMaker(text: 'ເບີໂທ', width: 6),
      ColumnMaker(text: '28492947', width: 6, align: SunmiPrintAlign.RIGHT),
    ]);

    await SunmiPrinter.printRow(cols: [
      ColumnMaker(text: 'ຄະແນນກັບຄືນ', width: 6),
      ColumnMaker(text: '2,000 ຄະແນນ', width: 6, align: SunmiPrintAlign.RIGHT),
    ]);

    await SunmiPrinter.printText('ຂໍຂອບໃຈ',
        style: SunmiStyle(
            align: SunmiPrintAlign.CENTER,
            bold: true,
            fontSize: SunmiFontSize.MD));
    await SunmiPrinter.lineWrap(3);
    await SunmiPrinter.submitTransactionPrint();
    await SunmiPrinter.exitTransactionPrint();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          centerTitle: true,
          title: const Text('SUNMI Printer by Devla'),
        ),
        body: Center(
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.center,
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              ElevatedButton(onPressed: () => printer(), child: const Text('打印机')),
              ElevatedButton(onPressed: () => printBarCode(), child: const Text('条形码')),
              ElevatedButton(onPressed: () => printQrCode(), child: const Text('二维码')),
            ],
          ),
        ));
  }
}

更多关于Flutter打印机控制插件devla_sunmi的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter打印机控制插件devla_sunmi的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


devla_sunmi 是一个用于在 Flutter 应用中控制商米(Sunmi)打印机的插件。它允许你通过 Flutter 应用与商米打印机进行交互,执行打印任务。以下是如何使用 devla_sunmi 插件的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  devla_sunmi: ^1.0.0  # 请使用最新版本

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

2. 导入插件

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

import 'package:devla_sunmi/devla_sunmi.dart';

3. 初始化打印机

在使用打印机之前,你需要初始化打印机:

void initPrinter() async {
  bool isInit = await DevlaSunmi.initPrinter();
  if (isInit) {
    print("Printer initialized successfully");
  } else {
    print("Failed to initialize printer");
  }
}

4. 打印文本

你可以使用 printText 方法来打印文本:

void printText() async {
  await DevlaSunmi.printText("Hello, World!");
}

5. 打印图片

你可以使用 printImage 方法来打印图片。图片需要是 Uint8List 格式:

void printImage() async {
  ByteData imageData = await rootBundle.load('assets/image.png');
  Uint8List imageBytes = imageData.buffer.asUint8List();
  await DevlaSunmi.printImage(imageBytes);
}

6. 打印二维码

你可以使用 printQRCode 方法来打印二维码:

void printQRCode() async {
  await DevlaSunmi.printQRCode("https://example.com");
}

7. 打印条形码

你可以使用 printBarcode 方法来打印条形码:

void printBarcode() async {
  await DevlaSunmi.printBarcode("123456789012");
}

8. 切纸

打印完成后,你可以使用 cutPaper 方法来切纸:

void cutPaper() async {
  await DevlaSunmi.cutPaper();
}

9. 检查打印机状态

你可以使用 getPrinterStatus 方法来检查打印机的状态:

void checkPrinterStatus() async {
  int status = await DevlaSunmi.getPrinterStatus();
  print("Printer status: $status");
}

10. 处理异常

在使用打印机时,可能会遇到各种异常情况,建议在代码中添加异常处理:

void printSomething() async {
  try {
    await DevlaSunmi.printText("Printing something...");
  } catch (e) {
    print("Error: $e");
  }
}

11. 释放资源

在应用退出或不再需要打印机时,可以释放资源:

void disposePrinter() async {
  await DevlaSunmi.dispose();
}

示例代码

以下是一个完整的示例代码,展示了如何使用 devla_sunmi 插件进行打印:

import 'package:flutter/material.dart';
import 'package:devla_sunmi/devla_sunmi.dart';
import 'package:flutter/services.dart';
import 'dart:typed_data';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: PrinterScreen(),
    );
  }
}

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

class _PrinterScreenState extends State<PrinterScreen> {
  [@override](/user/override)
  void initState() {
    super.initState();
    initPrinter();
  }

  void initPrinter() async {
    bool isInit = await DevlaSunmi.initPrinter();
    if (isInit) {
      print("Printer initialized successfully");
    } else {
      print("Failed to initialize printer");
    }
  }

  void printText() async {
    await DevlaSunmi.printText("Hello, World!");
  }

  void printImage() async {
    ByteData imageData = await rootBundle.load('assets/image.png');
    Uint8List imageBytes = imageData.buffer.asUint8List();
    await DevlaSunmi.printImage(imageBytes);
  }

  void printQRCode() async {
    await DevlaSunmi.printQRCode("https://example.com");
  }

  void printBarcode() async {
    await DevlaSunmi.printBarcode("123456789012");
  }

  void cutPaper() async {
    await DevlaSunmi.cutPaper();
  }

  void checkPrinterStatus() async {
    int status = await DevlaSunmi.getPrinterStatus();
    print("Printer status: $status");
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Sunmi Printer Example"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: printText,
              child: Text("Print Text"),
            ),
            ElevatedButton(
              onPressed: printImage,
              child: Text("Print Image"),
            ),
            ElevatedButton(
              onPressed: printQRCode,
              child: Text("Print QR Code"),
            ),
            ElevatedButton(
              onPressed: printBarcode,
              child: Text("Print Barcode"),
            ),
            ElevatedButton(
              onPressed: cutPaper,
              child: Text("Cut Paper"),
            ),
            ElevatedButton(
              onPressed: checkPrinterStatus,
              child: Text("Check Printer Status"),
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!