Flutter使用地图比较2个对象列表并包含不起作用

Posted

技术标签:

【中文标题】Flutter使用地图比较2个对象列表并包含不起作用【英文标题】:Flutter Comparing 2 lists of objects using map and contains not working 【发布时间】:2019-11-03 00:36:49 【问题描述】:

我有 2 个对象列表,即 newList 和 oldList,如下所示:

新列表:[Objectid: -LhnrmWPWN2X_cWdIAQW, title: , category: abandoned, latitude: -17.8594103, longitude: 30.9615846, Objectid: -LhnpMHQ3l288W28qoDW, title: , category: potholes, latitude: -17.8593472, longitude: 30.9614917]

旧列表:[Objectid: -LhnpMHQ3l288W28qoDW, title: , category: potholes, latitude: -17.8593472, longitude: 30.9614917]

问题是使用以下代码检查 newList 中的所有对象是否都在 oldList 中时使用 contains 不起作用:

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

事实上,这段代码对于 newList 中对象的两个实例都返回 true。

我希望代码应该只对其中一个对象返回 true。

请帮忙。

【问题讨论】:

【参考方案1】:

我想你想检查两个对象是否相等,

默认情况下,在 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;

我会推荐使用equatable 包

import 'package:equatable/equatable.dart';

class Person extends Equatable 
  final String name;

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

【讨论】:

【参考方案2】:

似乎您正在寻找 oldList 是否不包含代码 sn-p 中的对象。尝试使用此代码。

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

这里有一点snippet 上面代码的工作原理。

【讨论】:

片段打不开

以上是关于Flutter使用地图比较2个对象列表并包含不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:如何合并两个对象并对同一个key的值求和?

Flutter:使用分隔符从列表创建地图

将地图列表添加到 Firebase 时出错:Flutter

Flutter / Dart:地图列表与小部件列表?哪个更好?

Select2 验证并强制用户选择至少 X 个项目

归档后比较对象