qrcode_scan_page.dart 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. import 'dart:io';
  2. import 'package:flutter/material.dart';
  3. import 'package:lszlgl/page/sample_task/reap_sample_detail/reap_sample_task_page.dart';
  4. import 'package:qr_code_scanner/qr_code_scanner.dart';
  5. import '../../base/base_lifecycle_state.dart';
  6. import '../../widget/button.dart';
  7. class QrCodeScanPage extends StatefulWidget {
  8. const QrCodeScanPage({super.key});
  9. @override
  10. State<QrCodeScanPage> createState() => _QrCodeScanPageState();
  11. }
  12. class _QrCodeScanPageState extends BaseLifecycleState<QrCodeScanPage> {
  13. final GlobalKey qrKey = GlobalKey(debugLabel: 'QR');
  14. Barcode? result;
  15. QRViewController? controller;
  16. void _onQRViewCreated(QRViewController controller) {
  17. this.controller = controller;
  18. controller.scannedDataStream.listen((scanData) {
  19. debugPrint('code:${scanData.code} format:${scanData.format} rawBytes:${scanData.rawBytes}');
  20. controller.pauseCamera();
  21. parseCode(scanData);
  22. });
  23. }
  24. void parseCode(Barcode data) {
  25. String code = data.code ?? '';
  26. if (code.isEmpty) {
  27. showErrorDialog('内容为空,请扫描正确二维码');
  28. return;
  29. }
  30. // 121.36.17.6:19090/admin-api/zj/code-sampling-task-details-sgjc/getSamplingTaskDetails?id=47106
  31. List<String> split = code.split('?');
  32. if (!code.contains('?') || split.length <= 1 || !split[0].contains('/')) {
  33. showErrorDialog(code);
  34. return;
  35. }
  36. String api = split[0].split('/').last;
  37. Map<String, String> params = {};
  38. for (String value in split[1].split('&')) {
  39. List<String> kv = value.split('=');
  40. params[kv[0]] = kv[1];
  41. }
  42. switch (api) {
  43. case 'getSamplingTaskDetails':
  44. // 收获扦样详情
  45. if (params['id'] == null) {
  46. showErrorDialog(code);
  47. return;
  48. }
  49. MyRouter.startReapSampleTask(
  50. args: ReapSampleTaskPageArgs(id: num.parse(params['id']!), detail: true),
  51. replace: true,
  52. );
  53. default:
  54. showErrorDialog(code);
  55. }
  56. }
  57. void showErrorDialog(String msg) async {
  58. await showDialog(
  59. context: context,
  60. builder: (_) => AlertDialog(
  61. title: Text(msg),
  62. actions: [MyButton('确定', alignment: null, onTap: () => MyNavigator.pop())],
  63. ),
  64. );
  65. controller?.resumeCamera();
  66. }
  67. // In order to get hot reload to work we need to pause the camera if the platform
  68. // is android, or resume the camera if the platform is iOS.
  69. @override
  70. void reassemble() {
  71. super.reassemble();
  72. if (Platform.isAndroid) {
  73. controller!.pauseCamera();
  74. } else if (Platform.isIOS) {
  75. controller!.resumeCamera();
  76. }
  77. }
  78. @override
  79. void dispose() {
  80. controller?.dispose();
  81. super.dispose();
  82. }
  83. @override
  84. Widget build(BuildContext context) {
  85. return myScaffold(child: buildBody());
  86. }
  87. Widget buildBody() {
  88. return Column(
  89. children: [
  90. myAppBar(
  91. title: '扫一扫',
  92. actions: [buildFlash()],
  93. ),
  94. Expanded(
  95. child: QRView(
  96. key: qrKey,
  97. onQRViewCreated: _onQRViewCreated,
  98. ),
  99. ),
  100. ],
  101. );
  102. }
  103. Widget buildFlash() {
  104. return GestureDetector(
  105. onTap: () => controller?.toggleFlash(),
  106. behavior: HitTestBehavior.opaque,
  107. child: Container(
  108. padding: const EdgeInsets.symmetric(horizontal: 16),
  109. alignment: Alignment.center,
  110. child: const Text('闪光灯', style: TextStyle(fontSize: 14, color: Colors.white)),
  111. ),
  112. );
  113. }
  114. }