Flutter打印功能插件flutter_printer_plus的使用
flutter端【小票、标签】打印能力实现,支持USB、网口,支持Android、Windows平台。(无厂家SDK嵌入)
结合print_image_generate_tool
库可直接使用flutter-widget布局进行打印票据的样式开发,widget怎么写,打印出来的样式就是什么。
使用方式一:单独使用flutter_printer_plus
方式
1. 图像数据(Uint8List)转TSC、ESC
第一步:获取Uint8List
方案一:
使用widget绘制打印样式,通过print_image_generate_tool
库,将widget转Uint8List(参考使用方式二,或直接查看example中使用方式)。
方案二:
通过path_provider
库,将本地图片转Uint8List。
第二步:转TSC、ESC
// 转TSC字节,imageBytes类型为Uint8List
var printData = await PrinterCommandTool.generatePrintCmd(
imgData: imageBytes,
printType: PrintTypeEnum.label,
);
// 转ESC字节,imageBytes类型为Uint8List
var printData = await PrinterCommandTool.generatePrintCmd(
imgData: imageBytes,
printType: PrintTypeEnum.receipt,
);
2. 获取可用的打印机
提供能力获取USB打印机列表
搜索已连接(Android)/已安装驱动的(Windows)USB打印机。
// 返回 Future<List<UsbDeviceInfo>>
FlutterPrinterFinder.queryUsbPrinter()
提供能力获取网络打印机列表
// 返回 Future<List<String>>
FlutterPrinterFinder.queryPrinterIp()
3. 发送打印字节
USB传输(USB打印机)
// USB打印
final conn = UsbConn(usbDevice);
conn.writeMultiBytes(printData, 1024 * 3);
IP传输(网口打印机) example内提供获取局域网内可用打印机样例。
// IP打印
final conn = NetConn(ip);
conn.writeMultiBytes(printData);
使用方式二:结合print_image_generate_tool
的使用方式
直接将flutter widget转图像数据进行打印。
第一步:使用PrintImageGenerateWidget
作为根节点
MaterialApp(
onGenerateTitle: (context) => '打印测试',
home: Scaffold(
body: PrintImageGenerateWidget(
contentBuilder: (context) {
return const HomePage();
},
onPictureGenerated: _onPictureGenerated,
),
),
)
第二步:在_onPictureGenerated
方法中监听打印图层生成,并对接打印转码
// 打印刷图层生成成功
Future<void> _onPictureGenerated(PicGenerateResult data) async {
final printTask = data.taskItem;
// 指定的打印机
final printerInfo = printTask.params as PrinterInfo;
// 打印票据类型(标签、小票)
final printTypeEnum = printTask.printTypeEnum;
final imageBytes = await data.convertUint8List(imageByteFormat: ImageByteFormat.rawRgba);
// 也可以使用 ImageByteFormat.png
final argbWidth = data.imageWidth;
final argbHeight = data.imageHeight;
if (imageBytes == null) {
return;
}
// 只要 imageBytes不是使用 ImageByteFormat.rawRgba格式转换的 unit8List
// argbWidthPx、argbHeightPx 不要传值,默认为空就行
var printData = await PrinterCommandTool.generatePrintCmd(
imgData: imageBytes,
printType: printTypeEnum,
argbWidthPx: argbWidth,
argbHeightPx: argbHeight,
);
if (printerInfo.isUsbPrinter) {
// USB打印
final conn = UsbConn(printerInfo.usbDevice!);
conn.writeMultiBytes(printData, 1024 * 3);
} else if (printerInfo.isNetPrinter) {
// 网络打印
final conn = NetConn(printerInfo.ip!);
conn.writeMultiBytes(printData);
}
}
第三步:发送一个任务将flutter - widget
转打印图层,生成成功后会在上述方法中获取到图层
/// 例如:将 ReceiptStyleWidget 转打印图层
void doPrint() {
// 生成打印图层任务,指定任务类型为小票
PictureGeneratorProvider.instance.addPicGeneratorTask(
PicGenerateTask<PrinterInfo>(
tempWidget: ReceiptConstrainedBox(ReceiptStyleWidget()) as ATempWidget, // ReceiptConstrainedBox封装了小票宽高的限制条件
printTypeEnum: PrintTypeEnum.receipt,
params: printerInfo, // params是一个透传值,可以是任意类型,example中 params携带的是打印机数据,在 _onPictureGenerated 中跟随生成的打印图层可被获取到
),
);
}
/// 使用widget编写需要的小票样式,以下是样例
class ReceiptStyleWidget extends StatefulWidget {
const ReceiptStyleWidget({
Key? key,
}) : super(key: key);
[@override](/user/override)
State<StatefulWidget> createState() => _TempReceiptWidgetState();
}
class _TempReceiptWidgetState extends State<ReceiptStyleWidget> {
[@override](/user/override)
Widget build(BuildContext context) {
return _homeBody();
}
Widget _homeBody() {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'测试打印小票',
style: TextStyle(
color: Colors.black,
fontSize: 34.w,
fontWeight: FontWeight.bold,
),
),
],
);
}
}
更多关于Flutter打印功能插件flutter_printer_plus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
flutter_printer_plus
是一个用于在 Flutter 应用中实现打印功能的插件。它支持多种打印方式,包括蓝牙打印、网络打印和 USB 打印。以下是如何使用 flutter_printer_plus
插件的基本步骤:
1. 添加依赖
首先,在 pubspec.yaml
文件中添加 flutter_printer_plus
插件的依赖:
dependencies:
flutter:
sdk: flutter
flutter_printer_plus: ^1.0.0 # 请使用最新版本
然后运行 flutter pub get
来安装依赖。
2. 导入插件
在你的 Dart 文件中导入 flutter_printer_plus
插件:
import 'package:flutter_printer_plus/flutter_printer_plus.dart';
3. 初始化插件
在使用插件之前,通常需要先进行初始化:
void initPrinter() async {
await FlutterPrinterPlus.init();
}
4. 搜索打印机
你可以通过蓝牙、网络或 USB 搜索打印机:
void searchPrinters() async {
List<PrinterDevice> printers = await FlutterPrinterPlus.searchPrinters();
printers.forEach((printer) {
print('Printer: ${printer.name}, Address: ${printer.address}');
});
}
5. 连接打印机
选择要连接的打印机并建立连接:
void connectPrinter(PrinterDevice printer) async {
bool isConnected = await FlutterPrinterPlus.connect(printer);
if (isConnected) {
print('Connected to printer: ${printer.name}');
} else {
print('Failed to connect to printer: ${printer.name}');
}
}
6. 打印文本
连接成功后,你可以发送打印任务:
void printText(String text) async {
bool isPrinted = await FlutterPrinterPlus.printText(text);
if (isPrinted) {
print('Text printed successfully');
} else {
print('Failed to print text');
}
}
7. 打印图片
你也可以打印图片:
void printImage(String imagePath) async {
bool isPrinted = await FlutterPrinterPlus.printImage(imagePath);
if (isPrinted) {
print('Image printed successfully');
} else {
print('Failed to print image');
}
}
8. 断开连接
打印完成后,记得断开与打印机的连接:
void disconnectPrinter() async {
await FlutterPrinterPlus.disconnect();
print('Printer disconnected');
}
9. 处理权限
在某些情况下,你可能需要请求蓝牙或存储权限。确保在 AndroidManifest.xml
和 Info.plist
中添加必要的权限声明。
10. 示例代码
以下是一个完整的示例代码:
import 'package:flutter/material.dart';
import 'package:flutter_printer_plus/flutter_printer_plus.dart';
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> {
List<PrinterDevice> printers = [];
[@override](/user/override)
void initState() {
super.initState();
initPrinter();
}
void initPrinter() async {
await FlutterPrinterPlus.init();
}
void searchPrinters() async {
List<PrinterDevice> foundPrinters = await FlutterPrinterPlus.searchPrinters();
setState(() {
printers = foundPrinters;
});
}
void connectPrinter(PrinterDevice printer) async {
bool isConnected = await FlutterPrinterPlus.connect(printer);
if (isConnected) {
print('Connected to printer: ${printer.name}');
} else {
print('Failed to connect to printer: ${printer.name}');
}
}
void printText(String text) async {
bool isPrinted = await FlutterPrinterPlus.printText(text);
if (isPrinted) {
print('Text printed successfully');
} else {
print('Failed to print text');
}
}
void disconnectPrinter() async {
await FlutterPrinterPlus.disconnect();
print('Printer disconnected');
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Printer Example'),
),
body: Column(
children: [
ElevatedButton(
onPressed: searchPrinters,
child: Text('Search Printers'),
),
Expanded(
child: ListView.builder(
itemCount: printers.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(printers[index].name),
subtitle: Text(printers[index].address),
onTap: () => connectPrinter(printers[index]),
);
},
),
),
ElevatedButton(
onPressed: () => printText('Hello, World!'),
child: Text('Print Text'),
),
ElevatedButton(
onPressed: disconnectPrinter,
child: Text('Disconnect Printer'),
),
],
),
);
}
}