Flutter Сравнение 2 списков объектов с использованием карты и содержит не работает - PullRequest
0 голосов
/ 20 июня 2019

У меня есть 2 списка объектов, а именно newList и oldList, как показано ниже:

newList: [Object{id: -LhnrmWPWN2X_cWdIAQW, title: , category: abandoned, latitude: -17.8594103, longitude: 30.9615846}, Object{id: -LhnpMHQ3l288W28qoDW, title: , category: potholes, latitude: -17.8593472, longitude: 30.9614917}]

oldList: [Object{id: -LhnpMHQ3l288W28qoDW, title: , category: potholes, latitude: -17.8593472, longitude: 30.9614917}]

Проблема заключается в том, что при использованииСодержимое не работает при проверке, все ли объекты в newList находятся в oldList с использованием следующего кода:

newList.where((Object p) => !oldList.contains(p)) .map((Object obj) => print('\n\n\n\ntest \n$obj')) .toList();

Фактически этот код возвращает значение true для обоих экземпляров объекта в newList.

Я ожидаю, что код должен возвращать true только для одного из объектов.

Пожалуйста, помогите.

Ответы [ 2 ]

0 голосов
/ 20 июня 2019

Похоже, вы ищете, не содержит ли oldList объект в вашем фрагменте кода. Попробуйте использовать этот код.

newList.where((i) => oldList.contains(i)).map((obj) {
    print('${obj.id}');
    return obj;
  }).toList();

Вот небольшой фрагмент о том, как работает код выше.

0 голосов
/ 20 июня 2019

Я думаю, вы хотите проверить, равны ли два объекта или нет,

В Dart по умолчанию == возвращает значение true, если два объекта имеют одинаковый экземпляр. содержиттоже самое.

Кроме того, вы можете использовать пакет equatable , чтобы иметь возможность сравнивать объекты.

или, как предоставляет пакет equatable , вы можетеВы можете сделать это без пакета, вам нужно переопределить метод == в вашем объекте и персонал hashCode.

class Person {
  final String name;

  const Person(this.name);

  @override
  bool operator ==(Object other) =>
    identical(this, other) ||
    other is Person &&
    runtimeType == other.runtimeType &&
    name == other.name;

  @override
  int get hashCode => name.hashCode;
}

, но Я бы порекомендовал использовать равнозначный пакет

import 'package:equatable/equatable.dart';

class Person extends Equatable {
  final String name;

  Person(this.name) : super([name]);
}
...