import'dart:io';import'package:flutter/foundation.dart';import'package:flutter/material.dart';import'package:qr_code_scanner/qr_code_scanner.dart';const flashOn ='FLASH ON';const flashOff ='FLASH OFF';const frontCamera ='FRONT CAMERA';const backCamera ='BACK CAMERA';classScanextendsStatefulWidget{@override
_ScanState createState()=>_ScanState();}class_ScanStateextendsState<Scan>{
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.@overridevoidreassemble(){super.reassemble();if(Platform.isAndroid){
controller.pauseCamera();}elseif(Platform.isIOS){
controller.resumeCamera();}}@override
Widget build(BuildContext context){returnScaffold(
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}')elseText('Scan a code'),Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children:<Widget>[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:<Widget>[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)?280.0:300.0;// To ensure the Scanner view is properly sizes after rotation// we need to listen for Flutter SizeChanged notification and update controllerreturn NotificationListener<SizeChangedLayoutNotification>(
onNotification:(notification){
Future.microtask(()=> controller?.updateDimensions(qrKey, scanArea: scanArea));returnfalse;},
child:SizeChangedLayoutNotifier(
key:constKey('qr-size-notifier'),
child:QRView(
key: qrKey,
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;});});}@overridevoiddispose(){
controller.dispose();super.dispose();}}