通过在扫描仪对话框中启用自动缩放和改进错误处理来重构QR码扫描功能。更新ScanQrCodePage以利用AppQrScannerDialog获取玩家ID。

This commit is contained in:
2026-07-09 17:56:17 +08:00
parent 1c909277ff
commit fab49a9750
2 changed files with 25 additions and 13 deletions
@@ -5,6 +5,7 @@ import 'package:recording_tool/features/events/pages/page_event_info.dart';
import 'package:recording_tool/features/recording/model/model_recording_context.dart'; import 'package:recording_tool/features/recording/model/model_recording_context.dart';
import 'package:recording_tool/shared/widgets/app_bar.dart'; import 'package:recording_tool/shared/widgets/app_bar.dart';
import 'package:recording_tool/shared/widgets/app_button.dart'; import 'package:recording_tool/shared/widgets/app_button.dart';
import 'package:recording_tool/shared/widgets/app_qr_scanner_dialog.dart';
class ScanQrCodePage extends StatefulWidget { class ScanQrCodePage extends StatefulWidget {
const ScanQrCodePage({super.key}); const ScanQrCodePage({super.key});
@@ -49,11 +50,10 @@ class _AuthPageWidgetState extends State<ScanQrCodePage> {
child: AppButton( child: AppButton(
label: '扫码', label: '扫码',
onPressed: () async { onPressed: () async {
// final String? playerId = await AppQrScannerDialog.show( final String? playerId = await AppQrScannerDialog.show(
// context, context,
// ); );
// if (playerId == null || playerId.isEmpty) return; if (playerId == null || playerId.isEmpty) return;
// debugPrint('扫码结果: $playerId');
/// TODO /// TODO
AppNavigator.push( AppNavigator.push(
+20 -8
View File
@@ -41,6 +41,7 @@ class _AppQrScannerDialogState extends State<AppQrScannerDialog>
detectionSpeed: DetectionSpeed.noDuplicates, detectionSpeed: DetectionSpeed.noDuplicates,
facing: CameraFacing.back, facing: CameraFacing.back,
formats: const [BarcodeFormat.qrCode], formats: const [BarcodeFormat.qrCode],
autoZoom: true,
); );
_scanLineController = AnimationController( _scanLineController = AnimationController(
vsync: this, vsync: this,
@@ -59,25 +60,36 @@ class _AppQrScannerDialogState extends State<AppQrScannerDialog>
if (_hasScanned || capture.barcodes.isEmpty) return; if (_hasScanned || capture.barcodes.isEmpty) return;
final value = capture.barcodes.first.rawValue; final value = capture.barcodes.first.rawValue;
print('value:$value');
return;
if (value == null || value.isEmpty) return; if (value == null || value.isEmpty) return;
_hasScanned = true; _hasScanned = true;
final navigator = Navigator.of(context, rootNavigator: true); final navigator = Navigator.of(context, rootNavigator: true);
debugPrint('扫码结果: $value');
if (!mounted) return;
if (navigator.canPop()) {
navigator.pop(value);
}
unawaited(_stopScanner());
}
void _handleDetectError(Object error, StackTrace stackTrace) {
debugPrint('扫码识别失败: $error');
}
Future<void> _stopScanner() async {
try { try {
await _controller.stop(); await _controller.stop();
} catch (error) { } catch (error) {
debugPrint('停止扫码相机失败: $error'); debugPrint('停止扫码相机失败: $error');
} }
if (!mounted) return;
navigator.pop(value);
} }
void _close() { void _close() {
Navigator.of(context, rootNavigator: true).pop(); if (!mounted) return;
final navigator = Navigator.of(context, rootNavigator: true);
if (navigator.canPop()) {
navigator.pop();
}
} }
Rect _scanWindowFor(Size size) { Rect _scanWindowFor(Size size) {
@@ -101,8 +113,8 @@ class _AppQrScannerDialogState extends State<AppQrScannerDialog>
child: MobileScanner( child: MobileScanner(
controller: _controller, controller: _controller,
fit: BoxFit.cover, fit: BoxFit.cover,
scanWindow: scanWindow,
onDetect: _handleDetect, onDetect: _handleDetect,
onDetectError: _handleDetectError,
errorBuilder: _buildCameraError, errorBuilder: _buildCameraError,
placeholderBuilder: (_) => const ColoredBox( placeholderBuilder: (_) => const ColoredBox(
color: Colors.black, color: Colors.black,