Flutter热敏打印机控制插件thermal_printer的使用
Flutter热敏打印机控制插件thermal_printer的使用
thermal_printer
是一个用于发现打印机并发送打印命令的库。它支持多种平台(如Android、iOS和Windows)以及不同的接口(如蓝牙、BLE、USB和WiFi/以太网)。本文将介绍如何在Flutter项目中使用该插件。
主要特性
- 支持Android、iOS和Windows平台
- 扫描蓝牙设备
- 发送原始的
List<int> bytes
数据到设备
平台支持矩阵
功能 | Android | iOS | Windows | 描述 |
---|---|---|---|---|
USB接口 | ✅ | 🔳 | ✅ | 允许连接USB设备 |
蓝牙经典接口 | ✅ | 🔳 | 🔳 | 允许连接经典蓝牙设备 |
蓝牙低功耗(BLE)接口 | ✅ | ✅ | 🔳 | 允许连接BLE设备 |
网络(以太网/WiFi)接口 | ✅ | ✅ | ✅ | 允许连接网络设备 |
如何使用
初始化PrinterManager实例
首先,需要初始化 PrinterManager
实例:
import 'package:thermal_printer/thermal_printer.dart';
var printerManager = PrinterManager.instance;
扫描设备
根据打印机类型(如蓝牙、USB或网络),可以调用 discovery
方法来扫描设备:
var devices = [];
_scan(PrinterType type, {bool isBle = false}) {
// 查找打印机
PrinterManager.instance.discovery(type: type, isBle: isBle).listen((device) {
devices.add(device);
});
}
连接设备
选择合适的打印机类型,并连接到选定的设备:
_connectDevice(PrinterDevice selectedPrinter, PrinterType type, {bool reconnect = false, bool isBle = false, String? ipAddress = null}) async {
switch (type) {
case PrinterType.usb:
await PrinterManager.instance.connect(
type: type,
model: UsbPrinterInput(name: selectedPrinter.name, productId: selectedPrinter.productId, vendorId: selectedPrinter.vendorId));
break;
case PrinterType.bluetooth:
await PrinterManager.instance.connect(
type: type,
model: BluetoothPrinterInput(
name: selectedPrinter.name,
address: selectedPrinter.address!,
isBle: isBle,
autoConnect: reconnect));
break;
case PrinterType.network:
await PrinterManager.instance.connect(type: type, model: TcpPrinterInput(ipAddress: ipAddress ?? selectedPrinter.address!));
break;
default:
}
}
断开连接
断开当前连接的设备:
_disconnectDevice(PrinterType type) async {
await PrinterManager.instance.disconnect(type: type);
}
监听蓝牙状态变化
监听蓝牙设备的状态变化:
PrinterManager.instance.stateBluetooth.listen((status) {
log(' ----------------- status bt $status ------------------ ');
});
发送字节数据进行打印
生成要打印的数据,并通过 send
方法发送给打印机:
_sendBytesToPrint(List<int> bytes, PrinterType type) async {
PrinterManager.instance.send(type: type, bytes: bytes);
}
示例Demo
以下是一个完整的示例代码,展示了如何使用 thermal_printer
插件:
import 'dart:async';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:thermal_printer/thermal_printer.dart';
void main() => runApp(MyApp());
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
var defaultPrinterType = PrinterType.bluetooth;
var _isConnected = false;
var printerManager = PrinterManager.instance;
var devices = <PrinterDevice>[];
StreamSubscription<PrinterDevice>? _subscription;
@override
void initState() {
super.initState();
_scan();
}
void _scan() {
devices.clear();
_subscription = printerManager.discovery(type: defaultPrinterType).listen((device) {
devices.add(device);
setState(() {});
});
}
void _connectDevice(PrinterDevice device) async {
await printerManager.connect(
type: defaultPrinterType,
model: BluetoothPrinterInput(name: device.name, address: device.address!));
setState(() {
_isConnected = true;
});
}
void _disconnectDevice() async {
await printerManager.disconnect(type: defaultPrinterType);
setState(() {
_isConnected = false;
});
}
void _printTestTicket() async {
final profile = await CapabilityProfile.load();
final generator = Generator(PaperSize.mm58, profile);
List<int> bytes = [];
bytes += generator.text('Test Print', styles: const PosStyles(align: PosAlign.center));
bytes += generator.text('Product 1');
bytes += generator.text('Product 2');
printerManager.send(type: defaultPrinterType, bytes: bytes);
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: const Text('Thermal Printer Demo')),
body: Center(
child: Column(
children: [
ElevatedButton(
onPressed: !_isConnected ? () => _connectDevice(devices.first) : null,
child: const Text("Connect"),
),
ElevatedButton(
onPressed: _isConnected ? _disconnectDevice : null,
child: const Text("Disconnect"),
),
ElevatedButton(
onPressed: _isConnected ? _printTestTicket : null,
child: const Text("Print Test Ticket"),
),
Expanded(
child: ListView.builder(
itemCount: devices.length,
itemBuilder: (context, index) {
final device = devices[index];
return ListTile(
title: Text(device.name),
subtitle: Text(device.address!),
onTap: () => _connectDevice(device),
);
},
),
),
],
),
),
),
);
}
}
此示例展示了如何扫描、连接、断开连接和打印测试票。你可以根据自己的需求修改和扩展这个示例。
更多关于Flutter热敏打印机控制插件thermal_printer的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter热敏打印机控制插件thermal_printer的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用thermal_printer
插件来控制热敏打印机的示例代码。thermal_printer
插件允许你通过蓝牙或USB连接来控制热敏打印机。
1. 添加依赖
首先,在你的pubspec.yaml
文件中添加thermal_printer
依赖:
dependencies:
flutter:
sdk: flutter
thermal_printer: ^x.y.z # 替换为最新版本号
2. 导入插件
在你的Dart文件中导入插件:
import 'package:thermal_printer/thermal_printer.dart';
3. 初始化打印机
你需要初始化打印机,并检查是否有可用的打印机设备。以下是一个简单的示例,用于通过蓝牙连接打印机:
import 'package:flutter/material.dart';
import 'package:thermal_printer/thermal_printer.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
List<BluetoothDevice> devices = [];
BluetoothPrinter? printer;
@override
void initState() {
super.initState();
initPrinter();
}
void initPrinter() async {
// 获取所有可用的蓝牙设备
devices = await BluetoothPrinter.scanDevices();
if (devices.isNotEmpty) {
// 选择第一个设备(这里应该根据用户选择来确定)
printer = BluetoothPrinter(devices.first);
await printer!.connect();
print("Connected to printer: ${devices.first.name}");
} else {
print("No devices found");
}
}
void printReceipt() async {
if (printer != null && printer!.isConnected) {
await printer!.printText("Hello, this is a receipt!\n");
await printer!.printText("Thank you for your purchase.\n");
await printer!.cutPaper();
} else {
print("Printer is not connected");
}
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Thermal Printer Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Available Devices:'),
Text(devices.map((device) => device.name).join(", ")),
ElevatedButton(
onPressed: printReceipt,
child: Text('Print Receipt'),
),
],
),
),
),
);
}
}
4. 运行应用
确保你的设备启用了蓝牙,并且热敏打印机已经开启并处于可被发现的状态。然后运行你的Flutter应用,你应该能看到扫描到的蓝牙设备列表,并且能够通过点击按钮来打印收据。
注意事项
- 在实际使用中,你可能需要让用户从扫描到的设备列表中选择一个打印机。
- 你可能需要处理更多的错误情况,比如连接失败、打印失败等。
- 对于USB连接,你需要使用
UsbPrinter
类而不是BluetoothPrinter
类,并且需要处理USB设备的权限和连接。
这是一个基本的示例,希望能够帮助你入门如何在Flutter中使用thermal_printer
插件来控制热敏打印机。