Flutter打印机控制插件devla_sunmi的使用
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.NORMAL 或 PrinterStatus.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();
标签打印注意事项
条件限制
- 设置模式:要启用标签打印功能,请进入设置 -> 内置打印 -> 打印模式选择 -> 选择标签热敏模式。
- 学习标签纸:如果是第一次使用或更换了不同类型的标签纸,请进入设置 -> 内置打印 -> 标签学习 -> 点击“学习标签纸”。
示例代码(单张标签打印)
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
更多关于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"),
),
],
),
),
);
}
}