Flutter 如何在列表中搜索特定地图?

Flutter How to search a spesific map inside of list?

我的 UI 上有 3 个可选项目。 我用 ListViewBuilder 创建了这些。我的目标是将 selectedItem 上传到 Firebase。无论如何,例如;

List<Map<String?, dynamic>> selectedItems = List.empty(growable: true);

在上传 Firebase 之前列表将是这样的:

List selectedItems = [
      {
        'title': selectedItem[index].title,
        'price': selectedItem[index].price,
      },
    ];

这必须是我的 selectedItems 列表。

然后我将此列表上传为 Map,如下所示:

 Map<String, dynamic> updatedData = {'items': selectedItems};

为了 Firebase 设计,必须像这样。

首先,当用户单击我要检查的项目时 selectedItems 列表。 这是我的代码,但它根本不起作用:

if (selectedServices.contains(
                           [{
                           'title': selectedItem[index].title,
                           'price': selectedItem[index].price,
                           }])

问题就在这里。在此检查之后(它也总是通过,因为不工作)我尝试使用以下代码从 selectedItems 中删除相同的项目:

selectedServices.removeWhere((item) => mapEquals(
                                            item,
                                            ({
                                              'title': selectedItem[index].title,
                                              'price': selectedItem[index].price,
                                            })));

但它也不起作用,因为检查总是通过错误。在这些步骤之后,我的 onPressed 函数只在这个 else 代码块上工作。

else
        {
                selectedServices.addAll([{
                selectedItem[index].title:
                selectedItem[index].price
    }
    ]);}

一点总结; .contains 方法无法正常工作。如果还有另一种设置地图列表的方法,让我学习一下。这对我很重要,但最近几天我无法弄清楚。 最后,您能解释一下 Dart 的工作原理吗?

你不要尝试在这段代码中检查数组是否包含其他数组:

if (selectedServices.contains(
                           [{
                           'title': selectedItem[index].title,
                           'price': selectedItem[index].price,
                           }])

?

尝试检查 parameter-list 中的一项:

if (selectedServices.contains(
          {'title': selectedItem[index].title}
    ))

编辑:问题的焦点改变了,所以这个答案现在试图为包含复杂项目的列表实现类似 contains 的功能。

对于自定义相等性检查,可以通过 any:

实现与 contains 类似的功能
import 'package:collection/equality.dart';

void main() {
  final map1 = {
    'title': 'item1',
    'price': 12.34,
  };

  final map2 = {
    'title': 'item2',
    'price': 3.45,
  };

  final list = [map1, map2];

  final test1 = list.any((item)=>MapEquality().equals(item, {
    'title': 'item1',
    'price': 12.34,
  }));

  print(test1);
  
  final test2 = list.any((item)=>MapEquality().equals(item, {
    'title': 'item3',
    'price': 14.34,
  }));

  print(test2);
}

打印为:

true
false

您可能 运行 遇到双精度问题,或者如果您在地图中使用复杂的 key-value 对。