From f4cdfcb96f3c28602306462d1ad2207bb9a98003 Mon Sep 17 00:00:00 2001 From: Efril Date: Fri, 27 Feb 2026 19:09:39 +0700 Subject: [PATCH] fix print --- lib/core/function/app_function.dart | 4 +- lib/core/utils/printer_service.dart | 48 +++++++++++++-------- lib/data/dataoutputs/print_dataoutputs.dart | 2 +- 3 files changed, 34 insertions(+), 20 deletions(-) diff --git a/lib/core/function/app_function.dart b/lib/core/function/app_function.dart index d6d3945..912dae7 100644 --- a/lib/core/function/app_function.dart +++ b/lib/core/function/app_function.dart @@ -31,10 +31,10 @@ Future onPrint( await PrinterLocalDatasource.instance.getPrinterByCode('checker'); final kitchenPrinter = await PrinterLocalDatasource.instance.getPrinterByCode('kitchen'); - final barPrinter = - await PrinterLocalDatasource.instance.getPrinterByCode('bar'); final receiptPrinter = await PrinterLocalDatasource.instance.getPrinterByCode('receipt'); + final barPrinter = + await PrinterLocalDatasource.instance.getPrinterByCode('bar'); if (receiptPrinter != null) { try { diff --git a/lib/core/utils/printer_service.dart b/lib/core/utils/printer_service.dart index d759a7a..46a766e 100644 --- a/lib/core/utils/printer_service.dart +++ b/lib/core/utils/printer_service.dart @@ -11,7 +11,7 @@ class PrinterService { factory PrinterService() => _instance; PrinterService._internal(); - final Lock _lock = Lock(); + final Map _locks = {}; String? _connectedMac; /// Connect to Bluetooth printer @@ -60,13 +60,15 @@ class PrinterService { } } - /// Print with automatic printer type detection + Lock _getLock(String address) { + return _locks.putIfAbsent(address, () => Lock()); + } + Future printWithPrinter( PrintModel printer, List printData, BuildContext context) async { if (printer.type == 'Bluetooth') { - return await _lock.synchronized(() async { + return await _getLock(printer.address).synchronized(() async { try { - // Connect hanya kalau beda printer atau belum connected bool isConnected = await PrintBluetoothThermal.connectionStatus; if (!isConnected || _connectedMac != printer.address) { if (isConnected) { @@ -84,25 +86,25 @@ class PrinterService { return false; } _connectedMac = printer.address; - await Future.delayed(const Duration(milliseconds: 500)); + await Future.delayed( + const Duration(milliseconds: 1000)); // naikkan dari 500ms } - // Print - bool result = await PrintBluetoothThermal.writeBytes(printData); + bool result = await _writeBytesChunked(printData); + + // Beri waktu printer flush sebelum job berikutnya + await Future.delayed(const Duration(milliseconds: 1000)); + log("Print result ${printer.name}: $result"); return result; } catch (e, stackTrace) { _connectedMac = null; - FirebaseCrashlytics.instance.recordError( - e, - stackTrace, - reason: 'Error printing ${printer.name}', - information: [ - 'Printer: ${printer.name}', - 'MAC: ${printer.address}' - ], - ); - log("Error printing ${printer.name}: $e"); + FirebaseCrashlytics.instance.recordError(e, stackTrace, + reason: 'Error printing ${printer.name}', + information: [ + 'Printer: ${printer.name}', + 'MAC: ${printer.address}' + ]); return false; } }); @@ -111,6 +113,18 @@ class PrinterService { } } + // Kirim data per chunk untuk hindari buffer overflow Bluetooth + Future _writeBytesChunked(List data, {int chunkSize = 512}) async { + for (int i = 0; i < data.length; i += chunkSize) { + final end = (i + chunkSize > data.length) ? data.length : i + chunkSize; + final chunk = data.sublist(i, end); + bool result = await PrintBluetoothThermal.writeBytes(chunk); + if (!result) return false; + await Future.delayed(const Duration(milliseconds: 30)); + } + return true; + } + /// Print using Bluetooth printer Future printBluetooth(List printData) async { try { diff --git a/lib/data/dataoutputs/print_dataoutputs.dart b/lib/data/dataoutputs/print_dataoutputs.dart index 7e2cf8c..2942578 100644 --- a/lib/data/dataoutputs/print_dataoutputs.dart +++ b/lib/data/dataoutputs/print_dataoutputs.dart @@ -1831,7 +1831,7 @@ class PrintDataoutputs { : '--------------------------------', styles: const PosStyles(bold: false, align: PosAlign.center)); - paper == 80 ? bytes += generator.feed(3) : bytes += generator.feed(1); + paper == 80 ? bytes += generator.feed(3) : bytes += generator.feed(2); if (paper == 80) { bytes += generator.cut();