import 'package:chicken_farm/core/utils/logger.dart'; import 'package:chicken_farm/modes/rfid/rfid_model.dart'; import 'package:flutter/material.dart'; import 'package:chicken_farm/core/services/pda/rfid_manager.dart'; import 'package:chicken_farm/core/utils/toast.dart'; /// RFID字段组件,支持单个或多个RFID显示 /// /// 当[multiple]为true时,显示已识别的RFID数量 /// 当[multiple]为false时,显示单个RFID的具体值 class VberRfidField extends StatefulWidget { final List? rfids; final String? rfid; final ValueChanged? onRfidScanned; // RFID识别成功回调 final ValueChanged>? onRfidsScanned; // RFID识别成功回调 final ValueChanged? onKeyPress; // 按键事件 final bool multiple; final bool? multipleScan; final ValueChanged? onDeleteRfid; // 仅在multiple模式下使用 final String label; // 显示的标签文本 final String placeholder; // 未识别时显示的占位符文本 final String multiplePlaceholder; // 多个模式下未识别时显示的占位符文本 final String multipleFormat; // 多个模式下有值时的显示格式,包含一个%d占位符表示数量 const VberRfidField({ super.key, this.rfids, this.rfid, this.onRfidScanned, this.onRfidsScanned, this.onKeyPress, this.multiple = false, this.multipleScan, this.onDeleteRfid, this.label = '电子编号', this.placeholder = '未识别', this.multiplePlaceholder = '未识别', this.multipleFormat = '已识别 %d 枚电子编号', }); @override State createState() => _VberRfidFieldState(); } class _VberRfidFieldState extends State { late final RfidManager _rfidManager; bool _isScanning = false; // 内部管理识别状态 bool _isMultiple = false; // 内部管理识别状态 @override void initState() { super.initState(); _rfidManager = RfidManager( onTagScanned: _handleRfidsScanned, onRFIDScanned: _handleRfidScanned, onKeyPress: _handleKeyPress, onErrorScanned: _handleScanError, ); _isMultiple = widget.multipleScan ?? widget.multiple; _rfidManager.initRfid(); } @override void dispose() { _rfidManager.disposeRfid(); super.dispose(); } void _handleRfidScanned(String rfid) { logger.d('识别成功,已识别电子编号:$rfid'); setState(() { _isScanning = false; }); if (widget.onRfidScanned != null) { widget.onRfidScanned!(rfid); } } void _handleRfidsScanned(List rfidList) { logger.d('识别成功,已识别枚${rfidList.length}电子编号'); setState(() { _isScanning = false; }); if (widget.onRfidsScanned != null) { widget.onRfidsScanned!(rfidList); } } void _handleScanError(String error) { ToastUtil.error(error); setState(() { _isScanning = false; }); } void _handleKeyPress(String keyCode) { if (keyCode == 'KEY_619') { _scanRfid(); } } void _scanRfid() { setState(() { _isScanning = true; }); ToastUtil.success('开始识别电子编号'); _rfidManager.startScan(isMultiple: _isMultiple); } @override Widget build(BuildContext context) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text(widget.label, style: const TextStyle(fontWeight: FontWeight.bold)), const SizedBox(height: 10), Container( padding: const EdgeInsets.fromLTRB(16, 2, 16, 2), decoration: BoxDecoration( border: Border.all(color: Colors.grey), borderRadius: BorderRadius.circular(8), ), child: Row( children: [ Expanded( child: Text( _getDisplayText(), style: TextStyle( color: _hasValue() ? Colors.black : Colors.grey, fontSize: 16, ), ), ), IconButton( icon: _isScanning ? const SizedBox( width: 20, height: 20, child: CircularProgressIndicator(strokeWidth: 2), ) : Icon( widget.multiple ? Icons.add : Icons.qr_code_scanner, size: 20, ), onPressed: _isScanning ? null : _scanRfid, ), ], ), ), ], ); } /// 获取显示的文本 String _getDisplayText() { if (widget.multiple) { if (widget.rfids == null || widget.rfids!.isEmpty) { return widget.multiplePlaceholder; } else { return widget.multipleFormat.replaceAll( '%d', widget.rfids!.length.toString(), ); } } else { return widget.rfid ?? widget.placeholder; } } /// 判断是否有值 bool _hasValue() { if (widget.multiple) { return widget.rfids != null && widget.rfids!.isNotEmpty; } else { return widget.rfid != null; } } }