Flutter中如何去除Batch对象列表中的重复数据?
解决Hive存储Batch对象重复的问题
首先明确:直接用toSet()去重无效,是因为自定义的Batch对象默认按引用地址判断是否相等——哪怕两个对象内容完全一致,只要是不同实例,Set就会认定为不同项。
下面给你两种可行的解决方法:
方法1:重写Batch类的相等判断逻辑
在Batch类里重写==运算符和hashCode方法,用唯一标识(比如二维码内容、批次ID这类不会重复的字段)定义“两个Batch对象相等”的规则。
示例代码:
import 'package:hive/hive.dart'; part 'batch.g.dart'; // 对应Hive代码生成的文件 @HiveType(typeId: 0) class Batch extends HiveObject { @HiveField(0) String? qrCode; // 假设这是扫描得到的唯一二维码内容 @HiveField(1) DateTime? scannedTime; // 重写==,以qrCode作为相等判断依据 @override bool operator ==(Object other) { if (identical(this, other)) return true; return other is Batch && other.qrCode == qrCode; } // 基于qrCode生成hashCode @override int get hashCode => qrCode.hashCode; }
之后再用toSet()去重就会生效:
List<Batch> scannedBatches = [...]; // 你的原始扫描列表 List<Batch> uniqueBatches = scannedBatches.toSet().toList();
方法2:手动遍历去重(无需修改Batch类)
如果不想改动Batch类结构,可以手动维护一个已存在的唯一标识集合,遍历列表时过滤重复项:
List<Batch> originalList = [...]; List<Batch> uniqueList = []; final existingQrCodes = <String>{}; for (final batch in originalList) { // 用qrCode作为唯一判断依据,可替换成你的实际唯一字段 if (batch.qrCode != null && !existingQrCodes.contains(batch.qrCode)) { existingQrCodes.add(batch.qrCode!); uniqueList.add(batch); } }
额外建议:从根源避免重复
最好在添加新Batch到Hive之前就校验是否已存在,彻底避免重复存储:
final batchBox = Hive.box<Batch>('batch_box'); final newBatch = Batch()..qrCode = '扫描到的二维码内容'; // 检查是否已有相同qrCode的记录 bool isDuplicate = batchBox.values.any((b) => b.qrCode == newBatch.qrCode); if (!isDuplicate) { batchBox.add(newBatch); }
内容的提问来源于stack exchange,提问作者Madhanavel
相关产品推荐
相关产品推荐

