flutter:小票标签打印【跨平台解决方案】

引言

使用 flutter 进行 pos 软件开发,诸多的业务场景都涉及到了 小票标签 打印。基于通用化,跨平台的设计要求,小编整理了这篇文章。

核心设计思想

跨平台通用化方案我们主要解决以下三点:
image.png

  • 票据样式: 拒绝硬编码,直接使用 flutter-widget 进行样式开发,更加直观灵活

  • 打印指令集: 不嵌入厂商的打印SDK,适配一码多用,无后续接入开发消耗

  • 传输方式: 指令集传输方式可扩展,底层代码无需变动

整体方案流程

票据样式使用 flutter-widget 进行开发,打印策略使用光栅位图的统一标准进行指令集中转,所有的数据转换在 dart 层完成,网络打印机使用 dart-socket 进行传输,usb 传输封装各平台的 write 方法。

整个工具库做统一数据中转,各平台无需考虑数据层的处理,只处理数据传输。

image.png

步骤一: 将 widget 转换打印图层

使用 flutter-widget 开发票据样式,数据填充 widget 后,加入队列转 Uint8List 图像数据

功能实现可直接使用我们的开源库 print_image_generate_tool,提供能力将 widget 视图转换成 Uint8List 数据,内部维护队列,按加入顺序生成返回图像数据。

使用方式:

首先,初始化打印图层
  1. 在页面根节点下将打印图层 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;
    //... 打印逻辑下面补充
  }
  
  1. 将 widget 生成图层数据,注意: 传入的 tempWidget 必须实现或继承父类 ATempWidget
///生成打印的模板 Widget 需要继承这个类
mixin ATempWidget {
   
  //生成图片的缩放倍数
  double get pixelRatio => 1;

  //需要生成的票据像素宽度
  int get pixelPagerWidth;

  //需要生成的票据像素高度
  int get pixelPagerHeight => -
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李小轰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值