writeBytes method
Implementation
@override
Future writeBytes(List<int> data, {int? vendorId, int? productId}) async {
if (Platform.isWindows) {
await connect();
// Inform the spooler the document is beginning.
final dwJob = StartDocPrinter(hPrinter, 1, docInfo!);
if (dwJob == 0) {
ClosePrinter(hPrinter);
return Future.error('StartDocPrinter failed');
}
// Start a page.
if (StartPagePrinter(hPrinter) == 0) {
EndDocPrinter(hPrinter);
ClosePrinter(hPrinter);
return Future.error('StartPagePrinter failed');
}
// Send data to the printer in chunks to avoid buffer overflow.
// Writing all data at once can cause some printers to paginate
// (e.g., printing at A4 height) instead of continuous roll paper.
const int chunkSize = 4096;
int totalWritten = 0;
final chunks = data.chunkBy(chunkSize);
for (var chunk in chunks) {
final lpData = chunk.toUint8();
final chunkLen = chunk.length;
final writeResult =
WritePrinter(hPrinter, lpData, chunkLen, dwBytesWritten!);
totalWritten += dwBytesWritten!.value;
// Free the native memory after each chunk write.
free(lpData);
if (writeResult == 0) {
EndPagePrinter(hPrinter);
EndDocPrinter(hPrinter);
ClosePrinter(hPrinter);
return Future.error('WritePrinter failed after $totalWritten bytes');
}
}
// End the page.
if (EndPagePrinter(hPrinter) == 0) {
EndDocPrinter(hPrinter);
ClosePrinter(hPrinter);
return Future.error('EndPagePrinter failed');
}
// Inform the spooler that the document is ending.
if (EndDocPrinter(hPrinter) == 0) {
ClosePrinter(hPrinter);
return Future.error('EndDocPrinter failed');
}
// Tidy up the printer handle.
ClosePrinter(hPrinter);
} else if (Platform.isAndroid) {
try {
await connect();
var bytes = Uint8List.fromList(data);
int max = 16384;
/// maxChunk limit on android
var datas = bytes.chunkBy(max);
for (var data in datas) {
await usbPrinter.write(Uint8List.fromList(data));
}
await usbPrinter.close();
} catch (e) {
return Future.error(e.toString());
}
}
}