我已经
从产品“A”列表中,我想检查它们是否已在购物车(B 组)中,并以不同方式对待它们。
我在列表上使用 forEach() 方法。
附上代码,并输出
class Product {
final String id;
final String title;
final int price;
Product({required this.id, required this.title, required this.price});
}
List<Product> allProducts = [
Product(id: '1', title: 'Groovy Shorts', price: 12),
Product(id: '2', title: 'Karati Kit', price: 34),
Product(id: '3', title: 'Denim Jeans', price: 54),
Product(id: '4', title: 'Red Backpack', price: 14)
];
Set<Product> subProducts = {
Product(id: '1', title: 'Groovy Shorts', price: 12),
Product(id: '2', title: 'Karati Kit', price: 34),
};
void main() {
print(subProducts
.contains(Product(id: '1', title: 'Groovy Shorts', price: 12)));
print('----');
allProducts.forEach((product) {
print(product.id);
print(subProducts.contains(product));
});
}
Output
Restarted application in 136ms.
flutter: false
flutter: ----
flutter: 1
flutter: false
flutter: 2
flutter: false
flutter: 3
flutter: false
flutter: 4
flutter: false
对于上面的 1 和 2,我期望“true”
对于集合“B”中已有的产品(本例中为产品 1、产品 2),我期望输出为“true”,但产品 1、2 的输出为 false
我的逻辑似乎不够完善..需要帮助修复它。
在有意义地比较
Product
的实例之前,您必须覆盖相等运算符和哈希函数。
要明白我的意思,请考虑:
class Product {
final String id;
final String title;
final int price;
Product({
required this.id,
required this.title,
required this.price,
});
}
void main() {
final product1 = Product(id: '1', title: 'Groovy Shorts', price: 12);
final product2 = Product(id: '1', title: 'Groovy Shorts', price: 12);
print(product1 == product2); // Prints false
}
上面的程序打印
false
,因为 product1
和 product2
是不同的对象,恰好具有相同的实例字段。
您可以使用包中的 mixin,而不是手动覆盖相等运算符和哈希函数
equatable
:
import 'package:equatable/equatable.dart';
class Product with EquatableMixin {
final String id;
final String title;
final int price;
Product({
required this.id,
required this.title,
required this.price,
});
@override
List<Object?> get props => [id, title, price];
}
void main() {
final product1 = Product(id: '1', title: 'Groovy Shorts', price: 12);
final product2 = Product(id: '1', title: 'Groovy Shorts', price: 12);
print(product1 == product2); // Prints true
}