qr_scanner_screen.dart 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import 'package:flutter/material.dart';
  2. import 'package:go_router/go_router.dart';
  3. import 'package:mobile_scanner/mobile_scanner.dart';
  4. import '../../../core/l10n/app_localizations.dart';
  5. /// 二维码扫描页面
  6. ///
  7. /// 依赖: mobile_scanner: ^4.0.0
  8. ///
  9. /// 在 pubspec.yaml 中添加:
  10. /// dependencies:
  11. /// mobile_scanner: ^4.0.0
  12. class QrScannerScreen extends StatefulWidget {
  13. const QrScannerScreen({super.key});
  14. @override
  15. State<QrScannerScreen> createState() => _QrScannerScreenState();
  16. }
  17. class _QrScannerScreenState extends State<QrScannerScreen> {
  18. final MobileScannerController _controller = MobileScannerController();
  19. bool _hasResult = false;
  20. @override
  21. void dispose() {
  22. _controller.dispose();
  23. super.dispose();
  24. }
  25. @override
  26. Widget build(BuildContext context) {
  27. final cs = Theme.of(context).colorScheme;
  28. return Scaffold(
  29. appBar: AppBar(
  30. leading: IconButton(
  31. icon: const Icon(Icons.chevron_left, size: 28),
  32. onPressed: () => context.pop(),
  33. ),
  34. title: Text(AppLocalizations.of(context)!.scanQrCode, style: const TextStyle(fontSize: 18, fontWeight: FontWeight.w600)),
  35. centerTitle: true,
  36. ),
  37. body: _buildScannerBody(context, cs),
  38. );
  39. }
  40. Widget _buildScannerBody(BuildContext context, ColorScheme cs) {
  41. return MobileScanner(
  42. controller: _controller,
  43. onDetect: (capture) {
  44. if (_hasResult) return;
  45. for (final barcode in capture.barcodes) {
  46. final value = barcode.rawValue;
  47. if (value != null && value.isNotEmpty) {
  48. _hasResult = true;
  49. _controller.stop();
  50. context.pop(value);
  51. break;
  52. }
  53. }
  54. },
  55. );
  56. }
  57. }