Flutter项目中如何将数组重复日期字段后续值设为Null?
解决方案
步骤1:定义数据模型
先把API返回的data数组对象映射为Dart类,方便后续处理:
class Transaction { final int sid; final int userSid; final String category; final String regMethod; final String accountCd; final String paymentType; final String bizno; final int amount; final int amountSupply; final String taxFreeYn; String? useDate; // 用可空类型支持设为null final String useTime; final int useOrganization; Transaction({ required this.sid, required this.userSid, required this.category, required this.regMethod, required this.accountCd, required this.paymentType, required this.bizno, required this.amount, required this.amountSupply, required this.taxFreeYn, required this.useDate, required this.useTime, required this.useOrganization, }); // 从JSON解析为Transaction实例 factory Transaction.fromJson(Map<String, dynamic> json) { return Transaction( sid: json['sid'], userSid: json['userSid'], category: json['category'], regMethod: json['reg_method'], accountCd: json['account_cd'], paymentType: json['payment_type'], bizno: json['bizno'], amount: json['amount'], amountSupply: json['amount_supply'], taxFreeYn: json['tax_free_yn'], useDate: json['use_date'], useTime: json['use_time'], useOrganization: json['use_organization'], ); } // 创建修改后的副本(遵循Dart不可变对象原则) Transaction copyWith({String? useDate}) { return Transaction( sid: this.sid, userSid: this.userSid, category: this.category, regMethod: this.regMethod, accountCd: this.accountCd, paymentType: this.paymentType, bizno: this.bizno, amount: this.amount, amountSupply: this.amountSupply, taxFreeYn: this.taxFreeYn, useDate: useDate ?? this.useDate, useTime: this.useTime, useOrganization: this.useOrganization, ); } }
步骤2:处理重复的use_date
解析API返回的JSON后,用Set记录已出现的日期,遍历列表并修改对应字段:
// 假设apiResponse是从外部API获取的原始JSON Map Map<String, dynamic> apiResponse = { // 你的API返回数据 }; // 1. 解析data数组为Transaction列表 List<Transaction> originalList = (apiResponse['data'] as List) .map((item) => Transaction.fromJson(item)) .toList(); // 2. 去重处理use_date final Set<String> seenDates = {}; List<Transaction> processedList = originalList.map((item) { final currentDate = item.useDate; if (currentDate == null) return item; if (seenDates.contains(currentDate)) { // 重复日期,设为null或空字符串 return item.copyWith(useDate: null); // 若要设为空字符串,改为useDate: '' } else { seenDates.add(currentDate); return item; } }).toList();
关键说明
- 用
Set跟踪已出现的日期,查找效率为O(1),处理大数据量也不会有性能问题。 - 通过
copyWith方法生成新对象,避免修改原数据,符合Flutter的不可变状态管理习惯。
内容的提问来源于stack exchange,提问作者sopu5555
相关产品推荐
相关产品推荐

