import 'dart:async'; // import 'dart:convert'; import 'package:jc_printer/constants.dart'; import 'jc_printer_platform_interface.dart'; enum ConnectState { /// 连接中 connecting, /// 连接成功 connected, /// 未连接 none, } class JcPrinter { final _printer = JcPrinterPlatform.instance; late final StreamController _connectStateBroadcast; late final StreamController _printingCountBroadcast; late final StreamController> _errorInfoBroadcast; static final JcPrinter _instance = JcPrinter._internal(); factory JcPrinter() => _instance; JcPrinter._internal() { _connectStateBroadcast = StreamController.broadcast(); _printingCountBroadcast = StreamController.broadcast(); _errorInfoBroadcast = StreamController.broadcast(); _printer.printerStream.listen(_listener); } Stream get connectStateStream => _connectStateBroadcast.stream; Stream get printingCountStream => _printingCountBroadcast.stream; Stream> get errorInfoStream => _errorInfoBroadcast.stream; void _listener(dynamic event) { if (event is! Map) return; if (event['type'] == 'connectState') _connectStateListener(event); if (event['type'] == 'printingCount') _printingCountListener(event); if (event['type'] == 'errorInfo') _errorInfoListener(event); } void _connectStateListener(dynamic event) { _connectStateBroadcast.sink.add( event['result'] == true ? ConnectState.connected : ConnectState.none, ); } void _printingCountListener(dynamic event) { if (event['result'] is! Map) return; final result = event['result']; final count = int.tryParse(result['totalCount'].toString()) ?? 0; _printingCountBroadcast.sink.add(count); } void _errorInfoListener(dynamic event) { final code = event['result'].toString(); final msg = kErrorInfo[code] ?? ''; _errorInfoBroadcast.sink.add({'code': code, 'msg': msg}); } void connect(String name) { _connectStateBroadcast.sink.add(ConnectState.connecting); _printer.connect(name); } void disconnect() { _printer.disconnect(); } void setTotalPrints(int count) => _printer.setTotalPrints(count); /// 初始化画板。 /// /// @param width 画布宽度,单位mm。 /// /// @param height 画布高度,单位mm。 /// /// @param font 使用字体路径。 Future initDrawingBoard({ required double width, required double height, required String font, }) async { return _printer.initDrawingBoard(width: width, height: height, font: font); } /// 绘制文本。 /// /// @param x 水平坐标,单位mm。 /// /// @param y 垂直坐标,单位mm。 /// /// @param width 图片宽度,单位mm。 /// /// @param height 图片高度,单位mm。 /// /// @param content 内容。 /// /// @param rotate 旋转角度,支持角度0/90/180/270。 /// /// @param textAlignHorizontal 文本水平对齐方式 0 左对齐、1 水平居中对齐、2 右对齐。 /// /// @param textAlignVertical 文本竖直对齐方式 0 上对齐、1 垂直居中对齐、2 下对齐。 /// /// @param lineMode 换行方式 /// 1:宽高固定,内容大小自适应(字号/字符间距/行间距 按比例缩放) /// 2:宽度固定,高度自适应 /// 6.宽高固定,内容超过预设的宽高时自动缩小。 /// /// @param letterSpacing 字体间隔。 /// /// @param lineSpacing 行间隔。 Future drawLabelText({ required double width, required double height, required String content, required double fontSize, double x = 0, double y = 0, int rotate = 0, int textAlignHorizontal = 0, int textAlignVertical = 0, int lineMode = 1, double letterSpacing = 0, double lineSpacing = 0, }) async { await _printer.drawLabelText( x: x, y: y, width: width, height: height, content: content, fontSize: fontSize, rotate: rotate, textAlignHorizontal: textAlignHorizontal, textAlignVertical: textAlignVertical, lineMode: lineMode, letterSpacing: letterSpacing, lineSpacing: lineSpacing, ); } /// 绘制条码。 /// /// @param x 水平坐标,单位mm。 /// /// @param y 垂直坐标,单位mm。 /// /// @param width 图片宽度,单位mm。 /// /// @param height 图片高度,单位mm。 /// /// @param text 内容。 /// /// @param fontSize 字体大小。 /// /// @param rotate 旋转角度,支持角度0/90/180/270。 /// /// @param textHeight 文本高度,单位mm。 /// /// @param textPosition 文本位置,一维码文字识别码显示位置 /// 0:下方显示 /// 1:上方显示 /// 2:不显示。 /// /// @param codeType 一维码类型 /// 20:CODE128 /// 21:UPC-A /// 22:UPC-E /// 23:EAN8 /// 24:EAN13 /// 25:CODE93 /// 26:CODE39 /// 27:CODEBAR /// 28:ITF25。 Future drawLabelBarcode({ required double width, required double height, required String text, required double fontSize, required double textHeight, double x = 0, double y = 0, int rotate = 0, int codeType = 20, int textPosition = 0, }) async { await _printer.drawLabelBarcode( x: x, y: y, width: width, height: height, text: text, fontSize: fontSize, rotate: rotate, textHeight: textHeight, codeType: codeType, textPosition: textPosition, ); } /// 获取绘画数据 Future getLabelData() async => _printer.getLabelData(); /// 开始打印 /// /// @param data 绘画数据。 /// /// @param count 用于指定当前页的打印份数。 Future startPrint() async { return _printer.startJob( blackRules: 0, paperStyle: 1, ); } /// 提交打印任务 /// /// @param data 打印数据。 /// /// @param count 用于指定当前页的打印份数。 Future commit({ required String data, int count = 1, }) async { return _printer.commit(data: data, count: count); } /// 取消打印任务(打印完成之前调用) Future cancelPrint() async => _printer.cancelJob(); /// 结束打印任务(打印完成之后调用) Future endPrint() async => _printer.endPrint(); }