import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:qr_code_scanner/qr_code_scanner.dart'; void main() => runApp(MaterialApp(home: QRViewExample())); const flashOn = 'FLASH ON'; const flashOff = 'FLASH OFF'; const frontCamera = 'FRONT CAMERA'; const backCamera = 'BACK CAMERA'; class QRViewExample extends StatefulWidget { const QRViewExample({ Key key, }) : super(key: key); @override State createState() => _QRViewExampleState(); } class _QRViewExampleState extends State { Barcode result; var flashState = flashOn; var cameraState = frontCamera; 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(); if (Platform.isAndroid) { controller.pauseCamera(); } else if (Platform.isIOS) { controller.resumeCamera(); } } @override Widget build(BuildContext context) { return Scaffold( body: Column( children: [ Expanded(flex: 4, child: _buildQrView(context)), Expanded( flex: 1, child: FittedBox( fit: BoxFit.contain, child: Column( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ if (result != null) Text( 'Barcode Type: ${describeEnum(result.format)} Data: ${result.code}') else Text('Scan a code'), Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ Container( margin: EdgeInsets.all(8), child: RaisedButton( onPressed: () { if (controller != null) { controller.toggleFlash(); if (_isFlashOn(flashState)) { setState(() { flashState = flashOff; }); } else { setState(() { flashState = flashOn; }); } } }, child: Text(flashState, style: TextStyle(fontSize: 20)), ), ), Container( margin: EdgeInsets.all(8), child: RaisedButton( onPressed: () { if (controller != null) { controller.flipCamera(); if (_isBackCamera(cameraState)) { setState(() { cameraState = frontCamera; }); } else { setState(() { cameraState = backCamera; }); } } }, child: Text(cameraState, style: TextStyle(fontSize: 20)), ), ) ], ), Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ Container( margin: EdgeInsets.all(8), child: RaisedButton( onPressed: () { controller?.pauseCamera(); }, child: Text('pause', style: TextStyle(fontSize: 20)), ), ), Container( margin: EdgeInsets.all(8), child: RaisedButton( onPressed: () { controller?.resumeCamera(); }, child: Text('resume', style: TextStyle(fontSize: 20)), ), ) ], ), ], ), ), ) ], ), ); } bool _isFlashOn(String current) { return flashOn == current; } bool _isBackCamera(String current) { return backCamera == current; } 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, cameraFacing: CameraFacing.front, onQRViewCreated: _onQRViewCreated, overlay: QrScannerOverlayShape( borderColor: Colors.red, borderRadius: 10, borderLength: 30, borderWidth: 10, cutOutSize: scanArea, ), ); } void _onQRViewCreated(QRViewController controller) { this.controller = controller; controller.scannedDataStream.listen((scanData) { setState(() { result = scanData; }); }); } @override void dispose() { controller.dispose(); super.dispose(); } }