How can I delete duplicates in a Dart List? list.distinct()?

Use toSet and then toList

  var ids = [1, 4, 4, 4, 5, 6, 6];
  var distinctIds = ids.toSet().toList();

Result: [1, 4, 5, 6]

Or with spread operators:

var distinctIds = [...{...ids}];

I didn't find any of the provided answers very helpful. Here is what I generally do:

final ids = Set();
myList.retainWhere((x) => ids.add(x.id));

Of course you can use any attribute which uniquely identifies your objects. It doesn't have to be an id field.

Benefits over other approaches:

  • Preserves the original order of the list
  • Works for rich objects not just primitives/hashable types
  • Doesn't have to copy the entire list to a set and back to a list

Update 09/12/21
You can also declare an extension method once for lists:

extension Unique<E, Id> on List<E> {
  List<E> unique([Id Function(E element)? id, bool inplace = true]) {
    final ids = Set();
    var list = inplace ? this : List<E>.from(this);
    list.retainWhere((x) => ids.add(id != null ? id(x) : x as Id));
    return list;
  }
}

This extension method does the same as my original answer. Usage:

// Use a lambda to map an object to its unique identifier.
myRichObjectList.unique((x) => x.id);
// Don't use a lambda for primitive/hashable types.
hashableValueList.unique();