import 'dart:async' show Future; import '../config/routes.dart'; import '../state/app_state.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart' show PlatformException; import '../l10n/app_localizations.dart'; import '../ui/adaptive.dart' show AppScaffold, AdaptiveDialogAction; import 'package:barcode_scan2/barcode_scan2.dart' show BarcodeScanner; /// Page for adding accounts by scanning QR. class ScanQRPage extends StatefulWidget { const ScanQRPage({super.key}); @override State createState() => _ScanQRPageState(); } class _ScanQRPageState extends State { @override void initState() { super.initState(); // Trigger scan WidgetsBinding.instance.addPostFrameCallback( (_) async { try { final value = await _scan(); // Parse scanned value into item and pop var item = BaseItemType.newAuthenticatorItemFromUri(value); // Pop until scan page Navigator.of(context) .popUntil(ModalRoute.withName(AppRoutes.addScan)); // Pop with scanned item Navigator.of(context).pop(item); } catch (e) { await showAdaptiveDialog( context: context, builder: (BuildContext context) { return AlertDialog.adaptive( title: Text(AppLocalizations.of(context)!.error), content: Text(e.toString()), actions: [ AdaptiveDialogAction( child: Text(AppLocalizations.of(context)!.ok), onPressed: () { // Pop dialog Navigator.of(context).pop(); }, ) ], ); }); Navigator.of(context) .popUntil(ModalRoute.withName(AppRoutes.addScan)); Navigator.of(context).pop(); } }, ); } @override Widget build(BuildContext context) { return AppScaffold( title: Text(AppLocalizations.of(context)!.addScanQR), body: const Center(), ); } // Scans and returns scanned QR code // Adapted from documentation of flutter_barcode_reader Future _scan() async { try { var barcode = await BarcodeScanner.scan(); return barcode.rawContent; } on PlatformException catch (e) { if (e.code == BarcodeScanner.cameraAccessDenied) { return Future.error( AppLocalizations.of(context)!.errNoCameraPermission); } else { return Future.error('${AppLocalizations.of(context)!.errUnknown} $e'); } } on FormatException { return Future.error(AppLocalizations.of(context)!.errIncorrectFormat); } catch (e) { return Future.error('${AppLocalizations.of(context)!.errUnknown} $e'); } } }