printData method
Print data to printer device
Implementation
Future<void> printData(
Printer printer,
List<int> bytes, {
bool longData = false,
int? chunkSize,
}) async {
if (printer.connectionType == ConnectionType.USB) {
if (Platform.isWindows) {
// Windows USB printing using Win32 API
using((alloc) {
RawPrinter(printer.name!, alloc).printEscPosWin32(bytes);
});
return;
} else {
// Non-Windows USB printing
try {
await FlutterThermalPrinterPlatform.instance.printText(
printer,
Uint8List.fromList(bytes),
path: printer.address,
);
} catch (e) {
log('FlutterThermalPrinter: Unable to Print Data $e');
}
}
} else if (printer.connectionType == ConnectionType.BLE) {
try {
final services = await printer.discoverServices();
BleCharacteristic? writeCharacteristic;
for (final service in services) {
for (final characteristic in service.characteristics) {
if (characteristic.properties.contains(
CharacteristicProperty.write,
)) {
writeCharacteristic = characteristic;
break;
}
}
}
if (writeCharacteristic == null) {
log('No write characteristic found');
return;
}
final mtu = chunkSize ??
(Platform.isWindows
? 50
: await printer.requestMtu(Platform.isMacOS ? 150 : 500));
final maxChunkSize = mtu - 3;
for (var i = 0; i < bytes.length; i += maxChunkSize) {
final chunk = bytes.sublist(
i,
i + maxChunkSize > bytes.length ? bytes.length : i + maxChunkSize,
);
await writeCharacteristic.write(
Uint8List.fromList(chunk),
);
// Small delay between chunks to avoid overwhelming the device
if (longData) {
await Future.delayed(const Duration(milliseconds: 10));
}
}
return;
} catch (e) {
log('Failed to print data to device $e');
}
}
}