|
@@ -1,3 +1,5 @@
|
|
|
|
|
+import 'dart:async';
|
|
|
|
|
+
|
|
|
import 'package:chicken_farm/core/utils/logger.dart';
|
|
import 'package:chicken_farm/core/utils/logger.dart';
|
|
|
import 'package:chicken_farm/modes/rfid/rfid_model.dart';
|
|
import 'package:chicken_farm/modes/rfid/rfid_model.dart';
|
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter/material.dart';
|
|
@@ -21,6 +23,7 @@ class VberElectronicIdsField extends StatefulWidget {
|
|
|
final String placeholder; // 未识别时显示的占位符文本
|
|
final String placeholder; // 未识别时显示的占位符文本
|
|
|
final String multiplePlaceholder; // 多个模式下未识别时显示的占位符文本
|
|
final String multiplePlaceholder; // 多个模式下未识别时显示的占位符文本
|
|
|
final String multipleFormat; // 多个模式下有值时的显示格式,包含一个%d占位符表示数量
|
|
final String multipleFormat; // 多个模式下有值时的显示格式,包含一个%d占位符表示数量
|
|
|
|
|
+ final int scanMilliseconds; // 扫描时间,到达时间后自动停止扫描
|
|
|
|
|
|
|
|
const VberElectronicIdsField({
|
|
const VberElectronicIdsField({
|
|
|
super.key,
|
|
super.key,
|
|
@@ -36,6 +39,7 @@ class VberElectronicIdsField extends StatefulWidget {
|
|
|
this.placeholder = '未识别',
|
|
this.placeholder = '未识别',
|
|
|
this.multiplePlaceholder = '未识别',
|
|
this.multiplePlaceholder = '未识别',
|
|
|
this.multipleFormat = '已识别 %d 枚电子编号',
|
|
this.multipleFormat = '已识别 %d 枚电子编号',
|
|
|
|
|
+ this.scanMilliseconds = 3000,
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
@override
|
|
@override
|
|
@@ -45,6 +49,8 @@ class VberElectronicIdsField extends StatefulWidget {
|
|
|
class _VberElectronicIdsFieldState extends State<VberElectronicIdsField> {
|
|
class _VberElectronicIdsFieldState extends State<VberElectronicIdsField> {
|
|
|
bool _isScanning = false; // 内部管理识别状态
|
|
bool _isScanning = false; // 内部管理识别状态
|
|
|
bool _isMultiple = false; // 内部管理识别状态
|
|
bool _isMultiple = false; // 内部管理识别状态
|
|
|
|
|
+ Timer? _autoStopTimer; // 自动停止扫描的定时器
|
|
|
|
|
+ int _scanMilliseconds = 3000;
|
|
|
|
|
|
|
|
@override
|
|
@override
|
|
|
void initState() {
|
|
void initState() {
|
|
@@ -59,19 +65,24 @@ class _VberElectronicIdsFieldState extends State<VberElectronicIdsField> {
|
|
|
},
|
|
},
|
|
|
);
|
|
);
|
|
|
_isMultiple = widget.multipleScan ?? widget.multiple;
|
|
_isMultiple = widget.multipleScan ?? widget.multiple;
|
|
|
|
|
+ _scanMilliseconds = widget.scanMilliseconds;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
@override
|
|
|
void dispose() {
|
|
void dispose() {
|
|
|
|
|
+ // 取消自动停止定时器
|
|
|
|
|
+ _autoStopTimer?.cancel();
|
|
|
|
|
+ _autoStopTimer = null;
|
|
|
RfidManager.instance.disposeRfid();
|
|
RfidManager.instance.disposeRfid();
|
|
|
|
|
+
|
|
|
super.dispose();
|
|
super.dispose();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void _handleRfidScanned(String rfid) {
|
|
void _handleRfidScanned(String rfid) {
|
|
|
logger.d('识别成功,已识别电子编号:$rfid');
|
|
logger.d('识别成功,已识别电子编号:$rfid');
|
|
|
- setState(() {
|
|
|
|
|
- _isScanning = false;
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ // setState(() {
|
|
|
|
|
+ // _isScanning = false;
|
|
|
|
|
+ // });
|
|
|
if (widget.onIdScanned != null) {
|
|
if (widget.onIdScanned != null) {
|
|
|
widget.onIdScanned!(rfid);
|
|
widget.onIdScanned!(rfid);
|
|
|
}
|
|
}
|
|
@@ -79,9 +90,9 @@ class _VberElectronicIdsFieldState extends State<VberElectronicIdsField> {
|
|
|
|
|
|
|
|
void _handleRfidsScanned(List<RfidModel> rfidList) {
|
|
void _handleRfidsScanned(List<RfidModel> rfidList) {
|
|
|
logger.d('识别成功,已识别枚${rfidList.length}电子编号');
|
|
logger.d('识别成功,已识别枚${rfidList.length}电子编号');
|
|
|
- setState(() {
|
|
|
|
|
- _isScanning = false;
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ // setState(() {
|
|
|
|
|
+ // _isScanning = false;
|
|
|
|
|
+ // });
|
|
|
if (widget.onIdsScanned != null) {
|
|
if (widget.onIdsScanned != null) {
|
|
|
widget.onIdsScanned!(rfidList);
|
|
widget.onIdsScanned!(rfidList);
|
|
|
}
|
|
}
|
|
@@ -96,7 +107,11 @@ class _VberElectronicIdsFieldState extends State<VberElectronicIdsField> {
|
|
|
|
|
|
|
|
void _handleKeyPress(String keyCode) {
|
|
void _handleKeyPress(String keyCode) {
|
|
|
if (keyCode == 'KEY_619') {
|
|
if (keyCode == 'KEY_619') {
|
|
|
- _scanRfid();
|
|
|
|
|
|
|
+ if (_isScanning) {
|
|
|
|
|
+ _stopScan();
|
|
|
|
|
+ } else {
|
|
|
|
|
+ _scanRfid();
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -116,6 +131,30 @@ class _VberElectronicIdsFieldState extends State<VberElectronicIdsField> {
|
|
|
setState(() {
|
|
setState(() {
|
|
|
_isScanning = false;
|
|
_isScanning = false;
|
|
|
});
|
|
});
|
|
|
|
|
+ } else {
|
|
|
|
|
+ _autoStopTimer = Timer(Duration(milliseconds: _scanMilliseconds), () {
|
|
|
|
|
+ if (_isScanning) {
|
|
|
|
|
+ // 确保仍在扫描状态
|
|
|
|
|
+ _stopScan();
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ void _stopScan() async {
|
|
|
|
|
+ try {
|
|
|
|
|
+ if (_isScanning) {
|
|
|
|
|
+ await RfidManager.instance.stopRead();
|
|
|
|
|
+ }
|
|
|
|
|
+ // 取消自动停止定时器
|
|
|
|
|
+ _autoStopTimer?.cancel();
|
|
|
|
|
+ _autoStopTimer = null;
|
|
|
|
|
+ } catch (e) {
|
|
|
|
|
+ // ignore: avoid_print
|
|
|
|
|
+ } finally {
|
|
|
|
|
+ setState(() {
|
|
|
|
|
+ _isScanning = false;
|
|
|
|
|
+ });
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|