Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 如何在dart中按多个值对列表进行分组_Flutter_Dart - Fatal编程技术网

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刚刚更新了我的答案,我希望它现在能起作用;)好吧,这让我更容易理解。谢谢