Created
January 12, 2021 09:18
-
-
Save xvrh/6d982186f78bb98b47247641235b54e4 to your computer and use it in GitHub Desktop.
qr_code_scanner iOS 14 green dot
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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: Home())); | |
class Home extends StatelessWidget { | |
@override | |
Widget build(BuildContext context) { | |
return Scaffold( | |
body: Center( | |
child: ElevatedButton( | |
onPressed: () { | |
Navigator.push( | |
context, | |
MaterialPageRoute(builder: (context) => QRViewExample()), | |
); | |
}, | |
child: Text('Open'), | |
), | |
), | |
); | |
} | |
} | |
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(); | |
if (Platform.isAndroid) { | |
controller.pauseCamera(); | |
} else if (Platform.isIOS) { | |
controller.resumeCamera(); | |
} | |
} | |
@override | |
Widget build(BuildContext context) { | |
return Scaffold( | |
appBar: AppBar( | |
title: Text('Scan'), | |
), | |
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 | |
Text('Scan a code'), | |
Row( | |
mainAxisAlignment: MainAxisAlignment.center, | |
crossAxisAlignment: CrossAxisAlignment.center, | |
children: <Widget>[ | |
Container( | |
margin: EdgeInsets.all(8), | |
child: RaisedButton( | |
onPressed: () async { | |
await controller?.toggleFlash(); | |
setState(() {}); | |
}, | |
child: FutureBuilder( | |
future: controller?.getFlashStatus(), | |
builder: (context, snapshot) { | |
return Text('Flash: ${snapshot.data}'); | |
}, | |
)), | |
), | |
Container( | |
margin: EdgeInsets.all(8), | |
child: RaisedButton( | |
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 Text('loading'); | |
} | |
}, | |
)), | |
) | |
], | |
), | |
Row( | |
mainAxisAlignment: MainAxisAlignment.center, | |
crossAxisAlignment: CrossAxisAlignment.center, | |
children: <Widget>[ | |
Container( | |
margin: EdgeInsets.all(8), | |
child: RaisedButton( | |
onPressed: () async { | |
await controller?.pauseCamera(); | |
}, | |
child: Text('pause', style: TextStyle(fontSize: 20)), | |
), | |
), | |
Container( | |
margin: EdgeInsets.all(8), | |
child: RaisedButton( | |
onPressed: () async { | |
await controller?.resumeCamera(); | |
}, | |
child: 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, | |
cameraFacing: CameraFacing.front, | |
onQRViewCreated: _onQRViewCreated, | |
formatsAllowed: [BarcodeFormat.qrcode], | |
overlay: QrScannerOverlayShape( | |
borderColor: Colors.red, | |
borderRadius: 10, | |
borderLength: 30, | |
borderWidth: 10, | |
cutOutSize: scanArea, | |
), | |
); | |
} | |
void _onQRViewCreated(QRViewController controller) { | |
setState(() { | |
this.controller = controller; | |
}); | |
controller.scannedDataStream.listen((scanData) { | |
setState(() { | |
result = scanData; | |
}); | |
}); | |
} | |
@override | |
void dispose() { | |
controller?.dispose(); | |
super.dispose(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment