encodeBarcode method
Creates barcode from the given contents
Implementation
@override
Future<Encode> encodeBarcode({
required String contents,
required EncodeParams params,
}) async {
await _ensureBridge();
final String formatName = _formatToName[params.format] ?? 'QRCode';
// zxing-wasm WriterOptions: sizeHint (pixels), ecLevel ("L"/"M"/"Q"/"H"), withQuietZones
// ecLevel is only valid for formats in Format.eccSupported (QR Code etc.); omit it for linear codes.
const Map<int, String> eccMap = <int, String>{2: 'L', 4: 'M', 6: 'Q', 8: 'H'};
final String? ecLevel = CodeFormat.eccSupported.contains(params.format)
? eccMap[params.eccLevel.value]
: null;
final Map<String, dynamic> options = <String, dynamic>{
'format': formatName,
'sizeHint': params.width,
'ecLevel': ?ecLevel,
'withQuietZones': params.margin > 0,
};
dbg('[encode] $formatName ${params.width}x${params.height}');
final Stopwatch sw = Stopwatch()..start();
final JSString jsResult = await _jsWriteBarcode(
contents.toJS,
jsonEncode(options).toJS,
).toDart;
dbg('[encode] done ${sw.elapsedMilliseconds} ms');
final Map<String, dynamic> map =
jsonDecode(jsResult.toDart) as Map<String, dynamic>;
final String? error = map['error'] as String?;
if (error != null && error.isNotEmpty) {
dbg('[encode] ✗ error="$error"');
return Encode(false, params.format, contents, null, 0, error);
}
// Return the PNG from zxing-wasm as-is.
// WriterWidget detects PNG by magic bytes and uses Image.memory() directly,
// avoiding the raw-grayscale path that would introduce gray antialiasing pixels.
final Uint8List pngBytes = base64Decode(map['data'] as String);
dbg('[encode] ✓ PNG ${pngBytes.length} bytes');
return Encode(true, params.format, contents, pngBytes, pngBytes.length, null);
}