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 对。
我的 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 对。