比较List<Map<String, Object>>相同结果却返回false的问题
问题原因及解决办法
核心原因
Dart中的Map属于引用类型,默认的==运算符比较的是两个对象的内存引用地址,而非它们的内容。你代码里orderList[0]是一个已存在的Map实例,而{"Nasi Goreng": 1}是点击按钮时新创建的另一个Map实例——两者内容完全一致,但内存地址不同,因此==返回false,进而导致assert失败、contains找不到元素、indexOf返回-1。
解决办法
要比较两个Map的内容是否相等,有两种常用方式:
1. 使用官方提供的mapEquals函数
导入dart:collection库后,调用mapEquals方法直接比较Map内容:
import 'dart:collection'; // ... ElevatedButton(onPressed: () { print(orderList); assert(mapEquals(orderList[0], {"Nasi Goreng": 1})); }, child: Text("+"))
2. 手动实现内容比较逻辑
如果不想导入额外库,可以自己写一个比较函数:
bool compareMaps(Map<String, Object> a, Map<String, Object> b) { if (a.length != b.length) return false; for (final key in a.keys) { if (!b.containsKey(key) || a[key] != b[key]) { return false; } } return true; } // ... ElevatedButton(onPressed: () { print(orderList); assert(compareMaps(orderList[0], {"Nasi Goreng": 1})); }, child: Text("+"))
对于contains和indexOf方法,同样需要基于内容比较来判断,比如可以用any方法替代contains:
// 判断orderList中是否包含内容匹配的Map bool hasMatch = orderList.any((map) => mapEquals(map, {"Nasi Goreng": 1}));
内容的提问来源于stack exchange,提问作者Arya Suwandika
相关产品推荐
相关产品推荐

