abrirScannerComFallback function
Future<void>
abrirScannerComFallback(
- BuildContext context,
- WebViewController controller
)
Implementation
Future<void> abrirScannerComFallback(
BuildContext context,
WebViewController controller,
) async {
print('Platform.isIOS ${Platform.isIOS}');
if (Platform.isIOS) {
await Navigator.of(context).push(
MaterialPageRoute(
builder:
(_) => BeMallQRScannerPage(
onDetect: (
String? qrCode,
String? imagePath,
Uint8List? imageBytes,
) async {
final imageBase64 =
imagePath != null && imagePath.isNotEmpty
? base64Encode(await XFile(imagePath).readAsBytes())
: '';
DebugLogger.logPostMessageToPWA(
qrCode,
imagePath ?? '',
imageBase64,
);
final js = '''
(function() {
try {
const base64 = "${imageBase64}";
const byteCharacters = atob(base64);
const byteNumbers = new Array(byteCharacters.length);
for (let i = 0; i < byteCharacters.length; i++) {
byteNumbers[i] = byteCharacters.charCodeAt(i);
}
const byteArray = new Uint8Array(byteNumbers);
const blob = new Blob([byteArray], { type: 'image/jpeg' });
const file = new File([blob], 'cupom.jpg', { type: 'image/jpeg' });
const dataTransfer = new DataTransfer();
dataTransfer.items.add(file);
const fileList = dataTransfer.files;
const eventData = {
qrcode: "${qrCode ?? ''}",
imageBase64: base64,
fileList,
};
if (typeof window.onBemallSdkData === 'function') {
window.onBemallSdkData(eventData);
} else {
window.dispatchEvent(new CustomEvent('bemallSdkData', { detail: eventData }));
}
if ("${qrCode ?? ''}" !== '') {
document.dispatchEvent(new CustomEvent('qrCodeDetected', {
detail: { qrcode: "${qrCode ?? ''}", timestamp: new Date().toISOString() }
}));
}
} catch (e) {
window.dispatchEvent(new CustomEvent('bemallSdkData', { detail: 'Erro ao processar imagem base64 no WebView' }));
console.error('Erro ao processar imagem base64 no WebView', e);
}
})();
''';
await controller.runJavaScript(js);
},
),
),
);
} else {
// ===== Android (e outros): mantêm o fluxo atual =====
await Navigator.of(context).push(
MaterialPageRoute(
builder:
(_) => QRCameraScannerWidget(
onDetect: (String? qrCode, String? imagePath) async {
// Se vier path, lê bytes para base64 (mantendo seu comportamento atual)
final imageBase64 =
imagePath != null && imagePath.isNotEmpty
? base64Encode(await XFile(imagePath).readAsBytes())
: '';
DebugLogger.logPostMessageToPWA(
qrCode,
imagePath ?? '',
imageBase64,
);
final js = '''
(function() {
try {
const base64 = "${imageBase64}";
const byteCharacters = atob(base64);
const byteNumbers = new Array(byteCharacters.length);
for (let i = 0; i < byteCharacters.length; i++) {
byteNumbers[i] = byteCharacters.charCodeAt(i);
}
const byteArray = new Uint8Array(byteNumbers);
const blob = new Blob([byteArray], { type: 'image/jpeg' });
const file = new File([blob], 'cupom.jpg', { type: 'image/jpeg' });
const dataTransfer = new DataTransfer();
dataTransfer.items.add(file);
const fileList = dataTransfer.files;
const eventData = {
qrcode: "${qrCode ?? ''}",
imageBase64: base64,
fileList,
};
if (typeof window.onBemallSdkData === 'function') {
window.onBemallSdkData(eventData);
} else {
window.dispatchEvent(new CustomEvent('bemallSdkData', { detail: eventData }));
}
if ("${qrCode ?? ''}" !== '') {
document.dispatchEvent(new CustomEvent('qrCodeDetected', {
detail: { qrcode: "${qrCode ?? ''}", timestamp: new Date().toISOString() }
}));
}
} catch (e) {
window.dispatchEvent(new CustomEvent('bemallSdkData', { detail: 'Erro ao processar imagem base64 no WebView' }));
console.error('Erro ao processar imagem base64 no WebView', e);
}
})();
''';
await controller.runJavaScript(js);
},
),
),
);
}
}