From 7e93b7fcde1d49403b5d60ea124d513656488379 Mon Sep 17 00:00:00 2001 From: benedikts <sosnowskybene@gmail.com> Date: Tue, 31 May 2022 15:34:42 +0200 Subject: [PATCH] added functionality to scan qr- and barcodes --- .../event/barwidget.dart | 7 +- .../event/qr_scanner.dart | 173 +++++++++++++++++- 2 files changed, 177 insertions(+), 3 deletions(-) diff --git a/lib/bottom_navigation_bar_buttons/event/barwidget.dart b/lib/bottom_navigation_bar_buttons/event/barwidget.dart index b6d70a3..2d2890c 100644 --- a/lib/bottom_navigation_bar_buttons/event/barwidget.dart +++ b/lib/bottom_navigation_bar_buttons/event/barwidget.dart @@ -1,7 +1,7 @@ -import 'package:deggendorf_app/bottom_navigation_bar_buttons/event/qr_scanner.dart'; import 'package:flutter/material.dart'; import 'package:deggendorf_app/bottom_navigation_bar_buttons/event/imageslides.dart'; import 'package:deggendorf_app/bottom_navigation_bar_buttons/event/infobox_text.dart'; +import 'package:deggendorf_app/bottom_navigation_bar_buttons/event/qr_scanner.dart'; class BarWidget extends StatefulWidget { const BarWidget({Key? key, required this.barName}) : super(key: key); @@ -33,7 +33,10 @@ class _BarWidgetState extends State<BarWidget> { )), floatingActionButton: FloatingActionButton( onPressed: () { - QrScanner(); + Navigator.push( + context, + MaterialPageRoute(builder: (context) => QRViewExample()), + ); }, backgroundColor: Colors.green, child: Icon(Icons.qr_code_scanner), diff --git a/lib/bottom_navigation_bar_buttons/event/qr_scanner.dart b/lib/bottom_navigation_bar_buttons/event/qr_scanner.dart index e0520d9..93b48c2 100644 --- a/lib/bottom_navigation_bar_buttons/event/qr_scanner.dart +++ b/lib/bottom_navigation_bar_buttons/event/qr_scanner.dart @@ -1,6 +1,11 @@ -import 'package:flutter/cupertino.dart'; + +import 'dart:developer'; + +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:qr_code_scanner/qr_code_scanner.dart'; +/* class QrScanner extends StatefulWidget { const QrScanner({Key? key}) : super(key: key); @@ -14,3 +19,169 @@ class _QrScannerState extends State { return Scaffold(body: Container(color: Colors.greenAccent)); } } + */ + + + +class QRViewExample extends StatefulWidget { + const QRViewExample({Key? key}) : super(key: key); + + @override + State<StatefulWidget> createState() => _QRViewExampleState(); +} + +class _QRViewExampleState extends State<QRViewExample> { + Barcode? result; + QRViewController? controller; + final GlobalKey qrKey = GlobalKey(debugLabel: 'QR'); + + // In order to get hot reload to work we need to pause the camera if the platform + // is android, or resume the camera if the platform is iOS. + @override + void reassemble() { + super.reassemble(); + + controller!.pauseCamera(); + + + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Column( + children: <Widget>[ + Expanded(flex: 4, child: _buildQrView(context)), + Expanded( + flex: 1, + child: FittedBox( + fit: BoxFit.contain, + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: <Widget>[ + if (result != null) + Text( + 'Barcode Type: ${describeEnum(result!.format)} Data: ${result!.code}') + else + const Text('Scan a code'), + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: <Widget>[ + Container( + margin: const EdgeInsets.all(8), + child: ElevatedButton( + onPressed: () async { + await controller?.toggleFlash(); + setState(() {}); + }, + child: FutureBuilder( + future: controller?.getFlashStatus(), + builder: (context, snapshot) { + return Text('Flash: ${snapshot.data}'); + }, + )), + ), + Container( + margin: const EdgeInsets.all(8), + child: ElevatedButton( + onPressed: () async { + await controller?.flipCamera(); + setState(() {}); + }, + child: FutureBuilder( + future: controller?.getCameraInfo(), + builder: (context, snapshot) { + if (snapshot.data != null) { + return Text( + 'Camera facing ${describeEnum(snapshot.data!)}'); + } else { + return const Text('loading'); + } + }, + )), + ) + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: <Widget>[ + Container( + margin: const EdgeInsets.all(8), + child: ElevatedButton( + onPressed: () async { + await controller?.pauseCamera(); + }, + child: const Text('pause', + style: TextStyle(fontSize: 20)), + ), + ), + Container( + margin: const EdgeInsets.all(8), + child: ElevatedButton( + onPressed: () async { + await controller?.resumeCamera(); + }, + child: const Text('resume', + style: TextStyle(fontSize: 20)), + ), + ) + ], + ), + ], + ), + ), + ) + ], + ), + ); + } + + Widget _buildQrView(BuildContext context) { + // For this example we check how width or tall the device is and change the scanArea and overlay accordingly. + var scanArea = (MediaQuery.of(context).size.width < 400 || + MediaQuery.of(context).size.height < 400) + ? 150.0 + : 300.0; + // To ensure the Scanner view is properly sizes after rotation + // we need to listen for Flutter SizeChanged notification and update controller + return QRView( + key: qrKey, + onQRViewCreated: _onQRViewCreated, + overlay: QrScannerOverlayShape( + borderColor: Colors.red, + borderRadius: 10, + borderLength: 30, + borderWidth: 10, + cutOutSize: scanArea), + onPermissionSet: (ctrl, p) => _onPermissionSet(context, ctrl, p), + ); + } + + void _onQRViewCreated(QRViewController controller) { + setState(() { + this.controller = controller; + }); + controller.scannedDataStream.listen((scanData) { + setState(() { + result = scanData; + }); + }); + } + + void _onPermissionSet(BuildContext context, QRViewController ctrl, bool p) { + log('${DateTime.now().toIso8601String()}_onPermissionSet $p'); + if (!p) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('no Permission')), + ); + } + } + + @override + void dispose() { + controller?.dispose(); + super.dispose(); + } +} \ No newline at end of file -- GitLab