引言
使用 flutter 进行 pos 软件开发,诸多的业务场景都涉及到了 小票、标签 打印。基于通用化,跨平台的设计要求,小编整理了这篇文章。
核心设计思想
跨平台通用化方案我们主要解决以下三点:
-
票据样式: 拒绝硬编码,直接使用 flutter-widget 进行样式开发,更加直观灵活
-
打印指令集: 不嵌入厂商的打印SDK,适配一码多用,无后续接入开发消耗
-
传输方式: 指令集传输方式可扩展,底层代码无需变动
整体方案流程
票据样式使用 flutter-widget 进行开发,打印策略使用光栅位图的统一标准进行指令集中转,所有的数据转换在 dart 层完成,网络打印机使用 dart-socket 进行传输,usb 传输封装各平台的 write 方法。
整个工具库做统一数据中转,各平台无需考虑数据层的处理,只处理数据传输。
步骤一: 将 widget 转换打印图层
使用 flutter-widget 开发票据样式,数据填充 widget 后,加入队列转 Uint8List 图像数据
功能实现可直接使用我们的开源库 print_image_generate_tool,提供能力将 widget 视图转换成 Uint8List 数据,内部维护队列,按加入顺序生成返回图像数据。
使用方式:
首先,初始化打印图层
- 在页面根节点下将打印图层 PrintImageGenerateWidget 初始化
MaterialApp(
onGenerateTitle: (context) => '打印测试',
home: Scaffold(
body: PrintImageGenerateWidget(
contentBuilder: (context) {
return const HomePage();
},
onPictureGenerated: _onPictureGenerated, //用于接收 widget 转 Uint8List
),
),
)
//打印图层生成成功
Future<void> _onPictureGenerated(PicGenerateResult data) async {
//widget生成的图像的字节结果
final imageBytes = data.data;
//打印票据类型(标签、小票)
final printTypeEnum = printTask.printTypeEnum;
//... 打印逻辑下面补充
}
- 将 widget 生成图层数据,注意: 传入的 tempWidget 必须实现或继承父类 ATempWidget
///生成打印的模板 Widget 需要继承这个类
mixin ATempWidget {
//生成图片的缩放倍数
double get pixelRatio => 1;
//需要生成的票据像素宽度
int get pixelPagerWidth;
//需要生成的票据像素高度
int get pixelPagerHeight => -