qr_view_example.dart 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import 'package:fis_common/logger/logger.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:qr_code_scanner/qr_code_scanner.dart';
  4. class QRViewExample extends StatefulWidget {
  5. final Function(String) onPressed;
  6. const QRViewExample({Key? key, required this.onPressed}) : super(key: key);
  7. @override
  8. State<StatefulWidget> createState() => _QRViewExampleState();
  9. }
  10. class _QRViewExampleState extends State<QRViewExample> {
  11. Barcode? result;
  12. QRViewController? controller;
  13. final GlobalKey qrKey = GlobalKey(debugLabel: 'QR');
  14. @override
  15. Widget build(BuildContext context) {
  16. return Scaffold(
  17. appBar: AppBar(
  18. title: Text('扫一扫'),
  19. ),
  20. body: Column(
  21. children: <Widget>[
  22. Expanded(
  23. flex: 4,
  24. child: _buildQrView(
  25. context,
  26. ),
  27. ),
  28. ],
  29. ),
  30. );
  31. }
  32. @override
  33. void dispose() {
  34. controller?.dispose();
  35. super.dispose();
  36. }
  37. @override
  38. void reassemble() {
  39. super.reassemble();
  40. controller?.pauseCamera();
  41. controller?.resumeCamera();
  42. }
  43. Widget _buildQrView(BuildContext context) {
  44. var scanArea = (MediaQuery.of(context).size.width < 400 ||
  45. MediaQuery.of(context).size.height < 400)
  46. ? 150.0
  47. : 300.0;
  48. return QRView(
  49. key: qrKey,
  50. onQRViewCreated: _onQRViewCreated,
  51. overlay: QrScannerOverlayShape(
  52. borderColor: Theme.of(context).colorScheme.primary,
  53. borderRadius: 10,
  54. borderLength: 30,
  55. borderWidth: 10,
  56. cutOutSize: scanArea,
  57. ),
  58. onPermissionSet: (ctrl, p) => _onPermissionSet(context, ctrl, p),
  59. );
  60. }
  61. void _onPermissionSet(BuildContext context, QRViewController ctrl, bool p) {
  62. logger.i("QRViewExample _onPermissionSet $p");
  63. if (!p) {
  64. ScaffoldMessenger.of(context).showSnackBar(
  65. const SnackBar(
  66. content: Text(
  67. 'no Permission',
  68. ),
  69. ),
  70. );
  71. }
  72. }
  73. void _onQRViewCreated(QRViewController controller) {
  74. setState(() {
  75. this.controller = controller;
  76. });
  77. controller.scannedDataStream.listen((event) async {
  78. controller.dispose();
  79. widget.onPressed.call(event.code!);
  80. });
  81. }
  82. }