qr_view_example.dart 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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. import 'package:vitalapp/components/appbar.dart';
  5. class QRViewExample extends StatefulWidget {
  6. final Function(String) onPressed;
  7. final bool isBarcode;
  8. const QRViewExample({
  9. Key? key,
  10. required this.onPressed,
  11. this.isBarcode = false,
  12. }) : super(key: key);
  13. @override
  14. State<StatefulWidget> createState() => _QRViewExampleState();
  15. }
  16. class _QRViewExampleState extends State<QRViewExample> {
  17. Barcode? result;
  18. QRViewController? controller;
  19. final GlobalKey qrKey = GlobalKey(debugLabel: 'QR');
  20. CameraFacing _cameraFacing = CameraFacing.front;
  21. @override
  22. Widget build(BuildContext context) {
  23. return Scaffold(
  24. appBar: VAppBar(
  25. titleText: "扫一扫",
  26. actions: [
  27. IconButton(
  28. onPressed: () async {
  29. await controller?.flipCamera();
  30. setState(() {});
  31. },
  32. icon: Icon(
  33. Icons.change_circle_outlined,
  34. color: Colors.white,
  35. size: 36,
  36. ),
  37. ),
  38. SizedBox(
  39. width: 8,
  40. ),
  41. ],
  42. ),
  43. body: Column(
  44. children: <Widget>[
  45. Expanded(
  46. flex: 4,
  47. child: _buildQrView(
  48. context,
  49. ),
  50. ),
  51. ],
  52. ),
  53. );
  54. }
  55. @override
  56. void dispose() {
  57. controller?.dispose();
  58. super.dispose();
  59. }
  60. @override
  61. void reassemble() {
  62. super.reassemble();
  63. controller?.pauseCamera();
  64. controller?.resumeCamera();
  65. }
  66. Widget _buildQrView(BuildContext context) {
  67. return QRView(
  68. key: qrKey,
  69. cameraFacing: _cameraFacing,
  70. onQRViewCreated: _onQRViewCreated,
  71. overlay: QrScannerOverlayShape(
  72. borderColor: Theme.of(context).colorScheme.primary,
  73. borderRadius: 10,
  74. borderLength: 30,
  75. borderWidth: 10,
  76. cutOutSize: 400,
  77. ),
  78. formatsAllowed: widget.isBarcode
  79. ? [
  80. ///一维码则指定使用128的格式,会识别快一点
  81. BarcodeFormat.code128,
  82. ]
  83. : [],
  84. onPermissionSet: (ctrl, p) => _onPermissionSet(context, ctrl, p),
  85. );
  86. }
  87. void _onPermissionSet(BuildContext context, QRViewController ctrl, bool p) {
  88. logger.i("QRViewExample _onPermissionSet $p");
  89. if (!p) {
  90. ScaffoldMessenger.of(context).showSnackBar(
  91. const SnackBar(
  92. content: Text(
  93. 'no Permission',
  94. ),
  95. ),
  96. );
  97. }
  98. }
  99. void _onQRViewCreated(QRViewController controller) {
  100. setState(() {
  101. this.controller = controller;
  102. });
  103. controller.scannedDataStream.listen((event) async {
  104. controller.dispose();
  105. widget.onPressed.call(event.code!);
  106. });
  107. }
  108. }