Flutter打印机控制插件sunmi_printerx的使用
Flutter打印机控制插件sunmi_printerx的使用
特性
- 发现可用打印机
- 获取打印机状态
- 发送打印命令
- 打开并检查现金抽屉的状态
安装
在你的pubspec.yaml
文件中添加以下依赖项:
dependencies:
sunmi_printerx: ^1.0.0
然后运行flutter pub get
来安装新的依赖项。
使用
导入插件
import 'package:sunmi_printerx/sunmi_printerx.dart';
初始化插件
final sunmiPrinterX = SunmiPrinterX();
API 和示例
SunmiPrinterX
方法
Future<List<Printer>> getPrinters()
- 获取可用打印机列表。
示例:
final sunmiPrinterX = SunmiPrinterX();
List<Printer> printers = await sunmiPrinterX.getPrinters();
print(printers);
Printer
方法
Future<PrinterStatus> getStatus()
- 获取打印机状态。
示例:
PrinterStatus status = await printer.getStatus();
print(status);
Future<void> openCashDrawer()
- 打开现金抽屉。
示例:
await printer.openCashDrawer();
Future<bool> isCashDrawerOpen()
- 检查现金抽屉是否已打开。
示例:
bool isOpen = await printer.isCashDrawerOpen();
print(isOpen);
Future<void> printEscPosCommands(Uint8List commands)
- 发送ESC/POS命令到打印机。
示例:
await printer.printEscPosCommands(commands);
Future<void> waitForCashDrawerClose()
- 等待现金抽屉关闭。
示例:
await printer.waitForCashDrawerClose();
示例代码
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:sunmi_printerx/printer.dart';
import 'package:sunmi_printerx/sunmi_printerx.dart';
import 'package:sunmi_printerx/align.dart' as align;
import 'package:flutter_esc_pos_utils/flutter_esc_pos_utils.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
[@override](/user/override)
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
List<Printer> printers = [];
Map<String, bool> cashDrawerOpen = {};
final _sunmiPrinterXPlugin = SunmiPrinterX();
final _messangerKey = GlobalKey<ScaffoldMessengerState>();
[@override](/user/override)
void initState() {
super.initState();
initDefaultPrinter();
}
// 平台消息是异步的,因此我们在异步方法中进行初始化。
Future<void> initDefaultPrinter() async {
try {
final ps = await _sunmiPrinterXPlugin.getPrinters();
if (!mounted) return;
setState(() {
printers = ps;
cashDrawerOpen =
Map.fromIterable(ps, key: (e) => e.id, value: (_) => false);
});
} on PlatformException {
printers = [];
}
}
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
scaffoldMessengerKey: _messangerKey,
home: Scaffold(
appBar: AppBar(
title: const Text('插件示例应用'),
),
body: Column(
children: [
for (final printer in printers)
ListTile(
title: Text(
"打印机: ${printer.name} (现金抽屉: ${cashDrawerOpen[printer.id] == true ? '打开' : '关闭'})"),
subtitle: Text(printer.status.toString()),
trailing: Wrap(
children: [
TextButton(
onPressed: () async {
await printer.setAlign(align.Align.left);
await printer.printText('!"§$%&/()=? EUR €€€€€€ !',
bold: true);
await printer.setAlign(align.Align.center);
await printer.printText('ÄÖÜäöüß');
await printer.setAlign(align.Align.right);
await printer.printText('文本宽度比例1!',
underline: true, textWidthRatio: 1);
await printer.setAlign(align.Align.left);
await printer.printText('文本高度比例1!',
underline: true, textWidthRatio: 1);
await printer.printText('两个高度比例1!',
textWidthRatio: 1, textHeightRatio: 1);
await printer.printText('间距3!', textSpace: 3);
await printer.addText('下划线 ',
underline: true);
await printer.addText('加粗 ', bold: true);
await printer.addText('删除线\n',
strikethrough: true);
await printer.setAlign(align.Align.left);
// https://pub.dev 重复20次
await printer.printQrCode(
List.filled(20, 'https://pub.dev').join(),
dot: 5);
await printer.printTexts([
'列1',
'列2',
'列3',
], columnWidths: [
3,
6,
3
], columnAligns: [
align.Align.left,
align.Align.center,
align.Align.right
]);
await printer.autoOut();
},
child: const Text('打印SDK')),
TextButton(
onPressed: () async {
final profile = await CapabilityProfile.load();
final generator =
Generator(PaperSize.mm80, profile);
List<int> bytes = [];
bytes += generator.text(
'常规: aA bB cC dD eE fF gG hH iI jJ kK lL mM nN oO pP qQ rR sS tT uU vV wW xX yY zZ');
bytes += generator.text(
'特殊字符1: àÀ èÈ éÉ ûÛ üÜ çÇ ôÔ',
styles: const PosStyles(codeTable: 'CP1252'));
bytes += generator.text('特殊字符2: blåbærgrød',
styles: const PosStyles(codeTable: 'CP1252'));
bytes += generator.text('加粗文本',
styles: const PosStyles(bold: true));
bytes += generator.text('反向文本',
styles: const PosStyles(reverse: true));
bytes += generator.text('下划线文本',
styles: const PosStyles(underline: true),
linesAfter: 1);
bytes += generator.text('左对齐',
styles: const PosStyles(align: PosAlign.left));
bytes += generator.text('居中对齐',
styles:
const PosStyles(align: PosAlign.center));
bytes += generator.text('右对齐',
styles: const PosStyles(align: PosAlign.right),
linesAfter: 1);
bytes += generator.row([
PosColumn(
text: '列3',
width: 3,
styles: const PosStyles(
align: PosAlign.center, underline: true),
),
PosColumn(
text: '列6',
width: 6,
styles: const PosStyles(
align: PosAlign.center, underline: true),
),
PosColumn(
text: '列3',
width: 3,
styles: const PosStyles(
align: PosAlign.center, underline: true),
),
]);
bytes += generator.text('文本大小200%',
styles: const PosStyles(
height: PosTextSize.size2,
width: PosTextSize.size2,
));
// 打印条形码
final List<int> barData = [
1,
2,
3,
4,
5,
6,
7,
8,
9,
0,
4
];
bytes += generator.barcode(Barcode.upcA(barData));
bytes += generator.feed(2);
bytes += generator.cut();
await printer
.printEscPosCommands(Uint8List.fromList(bytes));
},
child: const Text('打印ESC/POS')),
TextButton(
onPressed: () async {
await printer.openCashDrawer();
setState(() {
cashDrawerOpen[printer.id] = true;
});
print("现金抽屉已打开");
await printer.waitForCashDrawerClose();
setState(() {
cashDrawerOpen[printer.id] = false;
});
print("现金抽屉已关闭");
},
child: const Text('打开现金抽屉')),
TextButton(
onPressed: () async {
final status = await printer.getStatus();
_messangerKey.currentState?.showSnackBar(
SnackBar(
content: Text('状态: $status'),
),
);
},
child: const Text('状态')),
],
),
),
TextButton(
onPressed: initDefaultPrinter, child: const Text('刷新')),
],
),
));
}
}
更多关于Flutter打印机控制插件sunmi_printerx的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter打印机控制插件sunmi_printerx的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
sunmi_printerx
是一个用于控制 Sunmi 打印机的 Flutter 插件。它允许你在 Flutter 应用中与 Sunmi 打印机进行交互,执行打印任务、查询打印机状态等操作。以下是如何在 Flutter 项目中使用 sunmi_printerx
插件的基本步骤。
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 sunmi_printerx
插件的依赖。
dependencies:
flutter:
sdk: flutter
sunmi_printerx: ^1.0.0 # 请使用最新版本
然后运行 flutter pub get
来获取依赖。
2. 初始化打印机
在使用打印机之前,你需要初始化打印机。通常在应用启动时进行初始化。
import 'package:sunmi_printerx/sunmi_printerx.dart';
void initPrinter() async {
bool isInitialized = await SunmiPrinterX.initPrinter();
if (isInitialized) {
print("Printer initialized successfully");
} else {
print("Failed to initialize printer");
}
}
3. 打印文本
你可以使用 SunmiPrinterX.printText
方法来打印文本。
void printText() async {
await SunmiPrinterX.printText("Hello, Sunmi Printer!");
await SunmiPrinterX.lineWrap(2); // 打印两行空白行
}
4. 打印图片
sunmi_printerx
还支持打印图片。你可以使用 SunmiPrinterX.printImage
方法来打印图片。
void printImage() async {
ByteData data = await rootBundle.load('assets/images/logo.png');
Uint8List bytes = data.buffer.asUint8List();
await SunmiPrinterX.printImage(bytes);
await SunmiPrinterX.lineWrap(2);
}
5. 打印二维码和条形码
你可以使用 SunmiPrinterX.printQRCode
和 SunmiPrinterX.printBarcode
方法来打印二维码和条形码。
void printQRCode() async {
await SunmiPrinterX.printQRCode("https://example.com", width: 200, height: 200);
await SunmiPrinterX.lineWrap(2);
}
void printBarcode() async {
await SunmiPrinterX.printBarcode("123456789012", barcodeType: SunmiBarcodeType.CODE128, width: 200, height: 100);
await SunmiPrinterX.lineWrap(2);
}
6. 查询打印机状态
你可以使用 SunmiPrinterX.getPrinterStatus
方法来查询打印机的状态。
void checkPrinterStatus() async {
SunmiPrinterStatus status = await SunmiPrinterX.getPrinterStatus();
switch (status) {
case SunmiPrinterStatus.NORMAL:
print("Printer is normal");
break;
case SunmiPrinterStatus.OUT_OF_PAPER:
print("Printer is out of paper");
break;
case SunmiPrinterStatus.OVERHEATED:
print("Printer is overheated");
break;
default:
print("Unknown printer status");
}
}
7. 其他功能
sunmi_printerx
还提供了其他功能,如设置打印对齐方式、字体大小、行间距等。你可以查阅插件的文档以了解更多详细信息。
8. 示例
以下是一个简单的示例,展示了如何初始化打印机并打印一些内容。
import 'package:flutter/material.dart';
import 'package:sunmi_printerx/sunmi_printerx.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: HomeScreen(),
);
}
}
class HomeScreen extends StatelessWidget {
void initPrinter() async {
bool isInitialized = await SunmiPrinterX.initPrinter();
if (isInitialized) {
print("Printer initialized successfully");
} else {
print("Failed to initialize printer");
}
}
void printContent() async {
await SunmiPrinterX.printText("Hello, Sunmi Printer!");
await SunmiPrinterX.lineWrap(2);
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Sunmi Printer Example"),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: initPrinter,
child: Text("Initialize Printer"),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: printContent,
child: Text("Print Text"),
),
],
),
),
);
}
}