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 VberElectronicIdsField extends StatefulWidget { final List? electronicIds; final String? electronicId; final ValueChanged? onIdScanned; // RFID识别成功回调 final ValueChanged>? onIdsScanned; // 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 VberElectronicIdsField({ super.key, this.electronicIds, this.electronicId, this.onIdScanned, this.onIdsScanned, this.onKeyPress, this.multiple = false, this.multipleScan, this.onDeleteRfid, this.label = '电子编号', this.placeholder = '未识别', this.multiplePlaceholder = '未识别', this.multipleFormat = '已识别 %d 枚电子编号', }); @override State createState() => _VberElectronicIdsFieldState(); } class _VberElectronicIdsFieldState extends State { bool _isScanning = false; // 内部管理识别状态 bool _isMultiple = false; // 内部管理识别状态 @override void initState() { super.initState(); logger.d('初始化RFID识别组件==>'); RfidManager.instance.registerCallbacks( onTagScanned: _handleRfidsScanned, onRFIDScanned: _handleRfidScanned, onKeyPress: _handleKeyPress, onErrorScanned: _handleScanError, ); _isMultiple = widget.multipleScan ?? widget.multiple; } @override void dispose() { logger.d('释放RFID识别组件==>'); RfidManager.instance.disposeRfid(); super.dispose(); } void _handleRfidScanned(String rfid) { logger.d('识别成功,已识别电子编号:$rfid'); setState(() { _isScanning = false; }); if (widget.onIdScanned != null) { widget.onIdScanned!(rfid); } } void _handleRfidsScanned(List rfidList) { logger.d('识别成功,已识别枚${rfidList.length}电子编号'); setState(() { _isScanning = false; }); if (widget.onIdsScanned != null) { widget.onIdsScanned!(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.show('开始识别电子编号', duration: 1); RfidManager.instance.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.electronicIds == null || widget.electronicIds!.isEmpty) { return widget.multiplePlaceholder; } else { return widget.multipleFormat.replaceAll( '%d', widget.electronicIds!.length.toString(), ); } } else { return widget.electronicId ?? widget.placeholder; } } /// 判断是否有值 bool _hasValue() { if (widget.multiple) { return widget.electronicIds != null && widget.electronicIds!.isNotEmpty; } else { return widget.electronicId != null; } } }