Flutter 如何在dart中按多个值对列表进行分组
假设我有以下清单:Flutter 如何在dart中按多个值对列表进行分组,flutter,dart,Flutter,Dart,假设我有以下清单: List<MoveItem> _items = [ MoveItem( shelf: A01, itemName: 'Dumpling', quantity: 3, expiryDate: DateTime(2021, 12, 8), ), MoveItem( shelf: A02, itemName: 'Dumpling', quantity: 3, expiryDate: DateTime(2021, 12, 8),
List<MoveItem> _items = [
MoveItem(
shelf: A01,
itemName: 'Dumpling',
quantity: 3,
expiryDate: DateTime(2021, 12, 8),
),
MoveItem(
shelf: A02,
itemName: 'Dumpling',
quantity: 3,
expiryDate: DateTime(2021, 12, 8),
),
MoveItem(
shelf: A03
itemName: 'Dumpling',
quantity: 3,
expiryDate: DateTime(2022, 01, 8),
),
MoveItem(
shelf: A04,
itemName: 'Meatball',
quantity: 3,
expiryDate: DateTime(2022, 02, 8),
),
MoveItem(
shelf: A05,
itemName: 'Meatball',
quantity: 3,
expiryDate: DateTime(2022, 02, 8),
),];
我会得到这个:
Dumpling 2021-12-8 3
Dumpling 2021-12-8 3
Dumpling 2022-01-8 3
Meatball 2022-02-8 3
Meatball 2022-02-8 3
我需要的结果是:
Dumpling 2021-12-8 6
Dumpling 2022-01-8 3
Meatball 2022-02-8 6
我还需要将每个组的数据向下传递到小部件树
使用集合包,我只能按itemName或expiryDate对它们进行分组。欢迎使用堆栈溢出 您可以使用项目名称和日期对它们进行分组,因为您希望这些值相同:
Map<String, MoveItem> groups = {};
for (MoveItem item in _items) {
String convertedDateTime =
"${item.expiryDate.year.toString()}-${item.expiryDate.month.toString().padLeft(2, '0')}-${item.expiryDate.day.toString().padLeft(2, '0')}";
if (groups[item.itemName + ' ' + convertedDateTime] == null)
groups[item.itemName + ' ' + convertedDateTime] = MoveItem(
expiryDate: item.expiryDate,
quantity: item.quantity,
itemName: item.itemName,
);
else
groups[item.itemName + ' ' + convertedDateTime].quantity += item.quantity;
}
我的模型:
class MoveItem {
String itemName;
int quantity;
DateTime expiryDate;
MoveItem({this.itemName, this.quantity, this.expiryDate});
@override
String toString() {
String convertedDateTime =
"${expiryDate.year.toString()}-${expiryDate.month.toString().padLeft(2, '0')}-${expiryDate.day.toString().padLeft(2, '0')}";
return itemName + ' - ' + convertedDateTime + ' ' + quantity.toString();
}
}
编辑:
要在ListView.builder中使用,更容易使用列表:
List<MoveItem> groups = [];
for (int i = 0; i < _items.length; i++) {
bool groupExists = false;
for (MoveItem group in groups) {
if (group.itemName == _items[i].itemName &&
group.expiryDate == _items[i].expiryDate) {
group.quantity += _items[i].quantity;
groupExists = true;
}
}
if (!groupExists) {
groups.add(_items[i]);
}
}
在列表视图中使用它:
ListView.builder(
itemCount: groups.length,
itemBuilder: (ctx, i) => Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
groups[i].itemName,
),
Text(DateFormat('yyyy-MM-dd')
.format(groups[i].expiryDate)),
Text(
groups[i].quantity.toString(),
)
],
),
),
欢迎来到堆栈溢出 您可以使用项目名称和日期对它们进行分组,因为您希望这些值相同:
Map<String, MoveItem> groups = {};
for (MoveItem item in _items) {
String convertedDateTime =
"${item.expiryDate.year.toString()}-${item.expiryDate.month.toString().padLeft(2, '0')}-${item.expiryDate.day.toString().padLeft(2, '0')}";
if (groups[item.itemName + ' ' + convertedDateTime] == null)
groups[item.itemName + ' ' + convertedDateTime] = MoveItem(
expiryDate: item.expiryDate,
quantity: item.quantity,
itemName: item.itemName,
);
else
groups[item.itemName + ' ' + convertedDateTime].quantity += item.quantity;
}
我的模型:
class MoveItem {
String itemName;
int quantity;
DateTime expiryDate;
MoveItem({this.itemName, this.quantity, this.expiryDate});
@override
String toString() {
String convertedDateTime =
"${expiryDate.year.toString()}-${expiryDate.month.toString().padLeft(2, '0')}-${expiryDate.day.toString().padLeft(2, '0')}";
return itemName + ' - ' + convertedDateTime + ' ' + quantity.toString();
}
}
编辑:
要在ListView.builder中使用,更容易使用列表:
List<MoveItem> groups = [];
for (int i = 0; i < _items.length; i++) {
bool groupExists = false;
for (MoveItem group in groups) {
if (group.itemName == _items[i].itemName &&
group.expiryDate == _items[i].expiryDate) {
group.quantity += _items[i].quantity;
groupExists = true;
}
}
if (!groupExists) {
groups.add(_items[i]);
}
}
在列表视图中使用它:
ListView.builder(
itemCount: groups.length,
itemBuilder: (ctx, i) => Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
groups[i].itemName,
),
Text(DateFormat('yyyy-MM-dd')
.format(groups[i].expiryDate)),
Text(
groups[i].quantity.toString(),
)
],
),
),
您可以尝试使用gridView builder如何让gridView显示我想要的结果?我有5个MoveItems,需要根据itemName和expiryDate值对它们进行分组您可以尝试使用gridView builder如何让gridView显示我要查找的结果?我有5个MoveItems,需要根据itemName和expiryDate值对它们进行分组谢谢你的回答。。。实际上,我并不介意使用Dart intl包来格式化日期。我的问题是,我需要将每组的值传递到下一个屏幕。有没有办法用你的答案做到这一点?我已经对原始问题进行了编辑以使其更清晰。@BillyJoseph刚刚更新了我的答案,我希望它现在能起作用;)好吧,这让我更容易理解。谢谢谢谢你的回答。。。实际上,我并不介意使用Dart intl包来格式化日期。我的问题是,我需要将每组的值传递到下一个屏幕。有没有办法用你的答案做到这一点?我已经对原始问题进行了编辑以使其更清晰。@BillyJoseph刚刚更新了我的答案,我希望它现在能起作用;)好吧,这让我更容易理解。谢谢