import 'dart:async'; import 'dart:ffi'; import 'dart:io'; import 'dart:typed_data'; import 'package:ffi/ffi.dart'; import 'package:flutter/services.dart'; import 'generated_bindings.dart'; class FlutterZxing { static const MethodChannel _channel = MethodChannel('flutter_zxing'); static Future get platformVersion async { final String? version = await _channel.invokeMethod('getPlatformVersion'); return version; } static final bindings = GeneratedBindings(dylib); static String zxingVersion() { return bindings.zxingVersion().cast().toDartString(); } static CodeResult zxingRead( Uint8List bytes, int width, int height, int cropSize) { return bindings.zxingRead(bytes.allocatePointer(), width, height, cropSize); } static EncodeResult zxingEncode(String contents, int width, int height, int format, int margin, int eccLevel) { var result = bindings.zxingEncode(contents.toNativeUtf8().cast(), width, height, format, margin, eccLevel); return result; } } // Getting a library that holds needed symbols DynamicLibrary _openDynamicLibrary() { if (Platform.isAndroid) { return DynamicLibrary.open('libflutter_zxing.so'); } else if (Platform.isWindows) { return DynamicLibrary.open("flutter_zxing_windows_plugin.dll"); } return DynamicLibrary.process(); } DynamicLibrary dylib = _openDynamicLibrary(); extension Uint8ListBlobConversion on Uint8List { /// Allocates a pointer filled with the Uint8List data. Pointer allocatePointer() { final blob = calloc(length); final blobBytes = blob.asTypedList(length); blobBytes.setAll(0, this); return blob; } }