encodeBarcode method

  1. @override
Future<Encode> encodeBarcode({
  1. required String contents,
  2. required EncodeParams params,
})
override

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);
}