76 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Dart
		
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Dart
		
	
	
	
| import 'dart:async';
 | |
| import 'dart:io';
 | |
| 
 | |
| import 'package:flutter/material.dart';
 | |
| 
 | |
| import 'package:extera_next/generated/l10n/l10n.dart';
 | |
| import 'package:qr_code_scanner_plus/qr_code_scanner_plus.dart';
 | |
| 
 | |
| class QrScannerModal extends StatefulWidget {
 | |
|   final void Function(String) onScan;
 | |
|   const QrScannerModal({required this.onScan, super.key});
 | |
| 
 | |
|   @override
 | |
|   QrScannerModalState createState() => QrScannerModalState();
 | |
| }
 | |
| 
 | |
| class QrScannerModalState extends State<QrScannerModal> {
 | |
|   final GlobalKey qrKey = GlobalKey(debugLabel: 'QR');
 | |
|   QRViewController? controller;
 | |
| 
 | |
|   @override
 | |
|   void reassemble() {
 | |
|     super.reassemble();
 | |
|     if (Platform.isAndroid) {
 | |
|       controller!.pauseCamera();
 | |
|     } else if (Platform.isIOS) {
 | |
|       controller!.resumeCamera();
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   @override
 | |
|   Widget build(BuildContext context) {
 | |
|     return Scaffold(
 | |
|       appBar: AppBar(
 | |
|         leading: IconButton(
 | |
|           icon: const Icon(Icons.close_outlined),
 | |
|           onPressed: Navigator.of(context).pop,
 | |
|           tooltip: L10n.of(context).close,
 | |
|         ),
 | |
|         title: Text(L10n.of(context).scanQrCode),
 | |
|       ),
 | |
|       body: Stack(
 | |
|         children: [
 | |
|           QRView(
 | |
|             key: qrKey,
 | |
|             onQRViewCreated: _onQRViewCreated,
 | |
|             overlay: QrScannerOverlayShape(
 | |
|               borderColor: Theme.of(context).colorScheme.primary,
 | |
|               borderRadius: 10,
 | |
|               borderLength: 30,
 | |
|               borderWidth: 8,
 | |
|             ),
 | |
|           ),
 | |
|         ],
 | |
|       ),
 | |
|     );
 | |
|   }
 | |
| 
 | |
|   void _onQRViewCreated(QRViewController controller) {
 | |
|     this.controller = controller;
 | |
|     // Workaround for QR Scanner is started in Pause mode
 | |
|     // https://github.com/juliuscanute/qr_code_scanner/issues/538#issuecomment-1133883828
 | |
|     if (Platform.isAndroid) {
 | |
|       controller.pauseCamera();
 | |
|     }
 | |
|     controller.resumeCamera();
 | |
|     late StreamSubscription sub;
 | |
|     sub = controller.scannedDataStream.listen((scanData) {
 | |
|       sub.cancel();
 | |
|       Navigator.of(context).pop();
 | |
|       final data = scanData.code;
 | |
|       if (data != null) widget.onScan(data);
 | |
|     });
 | |
|   }
 | |
| }
 |