diff --git a/lib/ui/qr_manager.dart b/lib/ui/qr_manager.dart index 642f18466566e42f65e12c3f52871f1dac51a952..50d3d65b5f9b9d54cd788be5578e23e2d9e1b504 100644 --- a/lib/ui/qr_manager.dart +++ b/lib/ui/qr_manager.dart @@ -1 +1,3 @@ -export 'qr_manager_mobile.dart' if (dart.library.html) 'qr_manager_web.dart'; +export 'qr_manager_mobile.dart' + if (dart.library.html) 'qr_manager_web.dart' + if (dart.library.io) 'qr_manager_linux.dart'; diff --git a/lib/ui/qr_manager_linux.dart b/lib/ui/qr_manager_linux.dart new file mode 100644 index 0000000000000000000000000000000000000000..83c32a20977b07c0671fc7ee934961301f1112c1 --- /dev/null +++ b/lib/ui/qr_manager_linux.dart @@ -0,0 +1,81 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_zxing/flutter_zxing.dart'; + +// ignore: avoid_classes_with_only_static_members +class QrManager { + static Future<String?> qrScan(BuildContext context) async { + try { + final Code? result = await Navigator.push( + context, + MaterialPageRoute( + builder: (BuildContext context) => const QrScannerScreen(), + ), + ); + + if (result != null && result.isValid) { + return result.text; + } else { + if (!context.mounted) { + return null; + } + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(tr('qr_scanner_no_qr_detected')), + backgroundColor: Colors.red, + ), + ); + return null; + } + } catch (e) { + debugPrint('Error scanning QR: $e'); + if (!context.mounted) { + return null; + } + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(tr('qr_scanner_error')), + backgroundColor: Colors.red, + ), + ); + return null; + } + } +} + +class QrScannerScreen extends StatelessWidget { + const QrScannerScreen({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text(tr('qr_scanner_title')), + ), + body: ReaderWidget( + onScan: (Code result) { + if (result.isValid) { + Navigator.of(context).pop(result); + } else { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(tr('qr_scanner_no_qr_detected')), + backgroundColor: Colors.red, + ), + ); + } + }, + onScanFailure: (Code? result) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(tr('qr_scanner_error')), + backgroundColor: Colors.red, + ), + ); + }, + scanDelay: const Duration(milliseconds: 500), + actionButtonsBackgroundColor: Colors.black.withOpacity(0.5), + ), + ); + } +} diff --git a/pubspec.lock b/pubspec.lock index 01d229613aeb210e47453d617dcde03130ea1a1f..792e8d1bf20a6d56527a7735f596bc9738ee72c0 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -238,6 +238,46 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.7" + camera: + dependency: transitive + description: + name: camera + sha256: "26ff41045772153f222ffffecba711a206f670f5834d40ebf5eed3811692f167" + url: "https://pub.dev" + source: hosted + version: "0.11.0+2" + camera_android_camerax: + dependency: transitive + description: + name: camera_android_camerax + sha256: e3627fdc2132d89212b8a8676679f5b07008c7e3d8ae00cea775c3397f9e742b + url: "https://pub.dev" + source: hosted + version: "0.6.10" + camera_avfoundation: + dependency: transitive + description: + name: camera_avfoundation + sha256: "2e4c568f70e406ccb87376bc06b53d2f5bebaab71e2fbcc1a950e31449381bcf" + url: "https://pub.dev" + source: hosted + version: "0.9.17+5" + camera_platform_interface: + dependency: transitive + description: + name: camera_platform_interface + sha256: b3ede1f171532e0d83111fe0980b46d17f1aa9788a07a2fbed07366bbdbb9061 + url: "https://pub.dev" + source: hosted + version: "2.8.0" + camera_web: + dependency: transitive + description: + name: camera_web + sha256: "595f28c89d1fb62d77c73c633193755b781c6d2e0ebcd8dc25b763b514e6ba8f" + url: "https://pub.dev" + source: hosted + version: "0.3.5" characters: dependency: transitive description: @@ -659,6 +699,38 @@ packages: url: "https://pub.dev" source: hosted version: "0.2.14" + file_selector_linux: + dependency: transitive + description: + name: file_selector_linux + sha256: b2b91daf8a68ecfa4a01b778a6f52edef9b14ecd506e771488ea0f2e0784198b + url: "https://pub.dev" + source: hosted + version: "0.9.3+1" + file_selector_macos: + dependency: transitive + description: + name: file_selector_macos + sha256: "271ab9986df0c135d45c3cdb6bd0faa5db6f4976d3e4b437cf7d0f258d941bfc" + url: "https://pub.dev" + source: hosted + version: "0.9.4+2" + file_selector_platform_interface: + dependency: transitive + description: + name: file_selector_platform_interface + sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b + url: "https://pub.dev" + source: hosted + version: "2.6.2" + file_selector_windows: + dependency: transitive + description: + name: file_selector_windows + sha256: "8f5d2f6590d51ecd9179ba39c64f722edc15226cc93dcc8698466ad36a4a85a4" + url: "https://pub.dev" + source: hosted + version: "0.9.3+3" filesystem_picker: dependency: "direct main" description: @@ -798,6 +870,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.2" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + sha256: "9b78450b89f059e96c9ebb355fa6b3df1d6b330436e0b885fb49594c41721398" + url: "https://pub.dev" + source: hosted + version: "2.0.23" flutter_slidable: dependency: "direct main" description: @@ -840,6 +920,14 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_zxing: + dependency: "direct main" + description: + name: flutter_zxing + sha256: "7ced1ebb196a5361964f03af37a8f51120271982698ff7befe34f7e35f0babbc" + url: "https://pub.dev" + source: hosted + version: "1.7.0" frontend_server_client: dependency: transitive description: @@ -1048,6 +1136,70 @@ packages: url: "https://pub.dev" source: hosted version: "4.3.0" + image_picker: + dependency: transitive + description: + name: image_picker + sha256: "021834d9c0c3de46bf0fe40341fa07168407f694d9b2bb18d532dc1261867f7a" + url: "https://pub.dev" + source: hosted + version: "1.1.2" + image_picker_android: + dependency: transitive + description: + name: image_picker_android + sha256: "8faba09ba361d4b246dc0a17cb4289b3324c2b9f6db7b3d457ee69106a86bd32" + url: "https://pub.dev" + source: hosted + version: "0.8.12+17" + image_picker_for_web: + dependency: transitive + description: + name: image_picker_for_web + sha256: "717eb042ab08c40767684327be06a5d8dbb341fe791d514e4b92c7bbe1b7bb83" + url: "https://pub.dev" + source: hosted + version: "3.0.6" + image_picker_ios: + dependency: transitive + description: + name: image_picker_ios + sha256: "4f0568120c6fcc0aaa04511cb9f9f4d29fc3d0139884b1d06be88dcec7641d6b" + url: "https://pub.dev" + source: hosted + version: "0.8.12+1" + image_picker_linux: + dependency: transitive + description: + name: image_picker_linux + sha256: "4ed1d9bb36f7cd60aa6e6cd479779cc56a4cb4e4de8f49d487b1aaad831300fa" + url: "https://pub.dev" + source: hosted + version: "0.2.1+1" + image_picker_macos: + dependency: transitive + description: + name: image_picker_macos + sha256: "3f5ad1e8112a9a6111c46d0b57a7be2286a9a07fc6e1976fdf5be2bd31d4ff62" + url: "https://pub.dev" + source: hosted + version: "0.2.1+1" + image_picker_platform_interface: + dependency: transitive + description: + name: image_picker_platform_interface + sha256: "9ec26d410ff46f483c5519c29c02ef0e02e13a543f882b152d4bfd2f06802f80" + url: "https://pub.dev" + source: hosted + version: "2.10.0" + image_picker_windows: + dependency: transitive + description: + name: image_picker_windows + sha256: "6ad07afc4eb1bc25f3a01084d28520496c4a3bb0cb13685435838167c9dcedeb" + url: "https://pub.dev" + source: hosted + version: "0.2.1+1" infinite_scroll_pagination: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 2eb14d9622911bd4d72a808d63b2e4d37a636e66..c9e9d19462092c7ffcdc9c8a9a05ee5c1bcfe252 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -129,6 +129,7 @@ dependencies: latlong2: ^0.9.1 flutter_speed_dial: ^7.0.0 intl: ^0.18.1 + flutter_zxing: ^1.7.0 dev_dependencies: flutter_test: