You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 11:30:51