Dart / Flutter - 将“列表中的每个元素”与另一个“集合”进行比较

问题描述 投票:0回答:1

我已经

  1. A - 类型,完整的产品列表,
  2. B - 类型 - 购物车中的产品,并且始终是“A”的子集

从产品“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

我的逻辑似乎不够完善..需要帮助修复它。

flutter dart
1个回答
0
投票

在有意义地比较

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
}
© www.soinside.com 2019 - 2024. All rights reserved.