A QR code scanner that works on both iOS and Android by natively embedding the platform view within Flutter. The integration with Flutter is seamless, much better than jumping into a native Activity or a ViewController to perform the scan.
| Android | |
|---|---|
|
|
|
| iOS | |
|
|
|
When a QR code is recognized, the text identified will be set in ‘qrText’.
class _QRViewExampleState extends State<QRViewExample> {
final GlobalKey qrKey = GlobalKey(debugLabel: 'QR');
Barcode result;
QRViewController controller;
/// Overriding reassemble and pausing the camera
/// ensures us that hot reload won't give a black screen
@override
void reassemble() {
super.reassemble();
controller.pauseCamera();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
children: <Widget>[
Expanded(
flex: 5,
// To ensure the Scanner view is properly sizes after rotation
// we need to listen for Flutter SizeChanged notification and update controller
child: NotificationListener<SizeChangedLayoutNotification>(
onNotification: (notification) {
Future.microtask(() => controller?.updateDimensions(qrKey));
return false;
},
child: SizeChangedLayoutNotifier(
key: const Key('qr-size-notifier'),
child: QRView(
key: qrKey,
onQRViewCreated: _onQRViewCreated,
),
),
),
),
Expanded(
flex: 1,
child: Center(
child: (result != null) ?
Text('Barcode Type: ${describeEnum(result.format)} Data: ${result.code}')
: Text('Scan a code'),
),
)
],
),
);
}
void _onQRViewCreated(QRViewController controller) {
this.controller = controller;
controller.scannedDataStream.listen((scanData) {
setState(() {
qrText = scanData;
});
});
}
@override
void dispose() {
controller?.dispose();
super.dispose();
}
}
In order to use this plugin, add the following to your Info.plist file:
<key>io.flutter.embedded_views_preview</key>
<true/>
<key>NSCameraUsageDescription</key>
<string>This app needs camera access to scan QR codes</string>
The default camera is the back camera.
controller.flipCamera();
By default, flash is OFF.
controller.toggleFlash();
Pause camera stream and scanner.
controller.pauseCamera();
Resume camera stream and scanner.
controller.resumeCamera();
Requires at least SDK 21 (Android 5.0).