Ответ
В Dart уникальность элементов в Set обеспечивается через корректную реализацию методов hashCode и оператора == (operator ==). Set использует хэш-таблицу, и для сравнения объектов сначала проверяет их хэш-коды, а затем, если хэш-коды совпали, вызывает == для точного сравнения.
Пример для кастомного класса:
class User {
final String id;
final String email;
User(this.id, this.email);
// Критически важно переопределить оба метода
@override
bool operator ==(Object other) {
return identical(this, other) ||
other is User &&
runtimeType == other.runtimeType &&
id == other.id; // Уникальность по ID
}
@override
int get hashCode => id.hashCode; // Хэш-код должен использовать те же поля, что и ==
}
void main() {
final users = <User>{};
final user1 = User('u1', 'alice@example.com');
final user2 = User('u1', 'alice.new@example.com'); // Тот же id
users.add(user1);
users.add(user2); // Не добавится, так как user2 == user1
print(users.length); // Вывод: 1
}
Для встроенных типов (String, int, etc.) эти методы уже корректно реализованы.