checkin_page.dart 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import 'package:chicken_farm/core/utils/logger.dart';
  2. import 'package:chicken_farm/routes/app_routes.dart';
  3. import 'package:flutter/material.dart';
  4. import 'package:chicken_farm/components/vb_app_bar.dart';
  5. import 'package:chicken_farm/components/qr_scanner.dart';
  6. import 'package:go_router/go_router.dart';
  7. const String _qrCodePrefix = 'vb@device@/checkin/';
  8. class CheckinPage extends StatefulWidget {
  9. const CheckinPage({super.key});
  10. @override
  11. State<CheckinPage> createState() => _CheckinPageState();
  12. }
  13. class _CheckinPageState extends State<CheckinPage> {
  14. Future<String?> _parseCheckinQRCode(String rawContent) async {
  15. try {
  16. // 替换掉 _qrCodePrefix
  17. final content = rawContent.replaceFirst(_qrCodePrefix, '');
  18. logger.d('parseCheckinQRCode: $content rawContent: $rawContent');
  19. if (content.isNotEmpty) {
  20. // 检查是否能转成int,能转就返回conetent,不能返回null
  21. return int.parse(content).toString();
  22. }
  23. return null;
  24. } catch (e) {
  25. return null;
  26. }
  27. }
  28. Future<void> _performCheckin(String scannedContent) async {
  29. // 跳转到签到记录页面 ,传递id参数为scannedContent(查询这个id的签到记录)
  30. if (context.mounted) {
  31. context.pushNamed(
  32. AppRouteNames.checkinRecord,
  33. pathParameters: {'id': scannedContent},
  34. );
  35. }
  36. }
  37. @override
  38. Widget build(BuildContext context) {
  39. return Scaffold(
  40. appBar: const VberAppBar(title: '点检签到', showLeftButton: true),
  41. body: QRScannerComponent(
  42. startWithString: _qrCodePrefix,
  43. onScanCallback: _performCheckin,
  44. invalidQRMessage: '签到二维码无效!',
  45. qrCodeParser: _parseCheckinQRCode,
  46. ),
  47. );
  48. }
  49. }