Viewing version 0.1.8. Open the latest package page.

equatable

0.1.8

An abstract class that helps to implement equality without needing to explicitly override == and hashCode.

Download archive

Readme


Overview

Being able to compare objects in Dart often involves having to override the == operator as well as hashCode.

Not only is it verbose and tedious, but failure to do so can lead to inefficient code which does not behave as we expect.

By default, == returns true if two objects are the same instance.

Let's say we have the following class:

class Person {
  final String name;

  const Person(this.name);
}

We can create create instances of Person like so:

void main() {
  final Person bob = Person("Bob");
}

Later if we try to compare two instances of Person either in our production code or in our tests we will run into a problem.

print(bob == Person("Bob")); // false

For more information about this, you can check out the official Dart Documentation.

In order to be able to compare two instances of Person we need to change our class to override == and hashCode like so:

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;
}

Now if we run the following code again:

print(bob == Person("Bob")); // true

it will be able to compare different instances of Person.

You can see how this can quickly become a hassle when dealing with complex classes. This is where Equatable comes in!

What does Equatable do?

Equatable overrides == and hashCode for you so you don't have to waste your time writing lots of boilerplate code.

There are other packages that will actually generate the boilerplate for you; however, you still have to run the code generation step which is not ideal.

With Equatable there is no code generation needed and we can focus more on writing amazing applications and less on mundane tasks.

Usage

First, we need to do add equatable to the dependencies of the pubspec.yaml

dependencies:
  equatable: ^0.1.6

Next, we need to install it:

# Dart
pub get

# Flutter
flutter packages get

Lastly, we need to extend Equatable

import 'package:equatable/equatable.dart';

class Person extends Equatable {
  final String name;

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

We can now compare instances of Person just like before without the pain of having to write all of that boilerplate.

Recap

Without Equatable

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;
}

With Equatable

import 'package:equatable/equatable.dart';

class Person extends Equatable {
  final String name;

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

Performance

You might be wondering what the performance impact will be if you use Equatable.

Performance Tests have been written to test how Equatable stacks up to manually overriding == and hashCode in terms of class instantiation as well as equality comparison.

Results (average over 10 runs)

Equality Comparison A == A

Class Runtime (microseconds)
RAW 0.143
Empty Equatable 0.124
Hydrated Equatable 0.126

Instantiation A()

Class Runtime (microseconds)
RAW 0.099
Empty Equatable 0.121
Hydrated Equatable 0.251
Changelog

0.1.0

Initial Version of the library.

  • Includes the ability to extend Equatable and not have to override == and hashCode.

0.1.1

Minor Updates to Documentation.

0.1.2

Additional Updates to Documentation.

  • Logo Added

0.1.3

Bug Fixes

0.1.4

Performance Optimizations

0.1.5

Additional Performance Optimizations & Documentation Updates

0.1.6

Documentation Updates

  • Performance Tests

0.1.7

Added toString override

0.1.8

Support Iterable props

Installing

export PUB_HOSTED_URL=https://pub.mirror.p-hatan.com
flutter pub add 'equatable:0.1.8'
pubspec.yaml
name: equatable
description: An abstract class that helps to implement equality without needing to explicitly override == and hashCode.
version: 0.1.8
author: felix.angelov <felangelov@gmail.com>
homepage: https://github.com/felangel/equatable

environment:
  sdk: ">=2.0.0-dev.28.0 <3.0.0"

dependencies:
  collection: ^1.14.11

dev_dependencies:
  test: ">=1.3.0 <2.0.0"
  test_coverage: ^0.2.0

Version history

VersionPublishedArchiveSHA-256
0.1.0Cached · Upstream SHA-256 matchedDownloadca67495c…472d7c
0.1.1Cached · Upstream SHA-256 matchedDownloaddc8bb0e1…68a1c4
0.1.2Cached · Upstream SHA-256 matchedDownload544ccbad…d9ec16
0.1.3Cached · Upstream SHA-256 matchedDownload26ab9f9e…085fcf
0.1.4Cached · Upstream SHA-256 matchedDownloadd378b5ba…615730
0.1.5Cached · Upstream SHA-256 matchedDownload3e268d04…4e4c6a
0.1.6Cached · Upstream SHA-256 matchedDownload034cd780…f1a860
0.1.7Cached · Upstream SHA-256 matchedDownload14cf3af5…e9ca5b
0.1.8Cached · Upstream SHA-256 matchedDownloadbfbb2d74…ce7772
0.1.9Cached · Upstream SHA-256 matchedDownload3ddd6fd4…22383c
0.1.10Cached · Upstream SHA-256 matchedDownloadb15487c8…b1ad27
0.2.0Cached · Upstream SHA-256 matchedDownload3d088bcd…1292d0
0.2.1Cached · Upstream SHA-256 matchedDownload2f404fd7…363918
0.2.2Cached · Upstream SHA-256 matchedDownload36981922…32a0d8
0.2.3Cached · Upstream SHA-256 matchedDownload3e7f49ce…6095b2
0.2.4Cached · Upstream SHA-256 matchedDownloadbc5fbad0…5555d5
0.2.5Cached · Upstream SHA-256 matchedDownload0a1d7e46…ba66cb
0.2.6Cached · Upstream SHA-256 matchedDownload25b1afe7…163e60
0.3.0Cached · Upstream SHA-256 matchedDownload0f8be44d…3f64b9
0.4.0Cached · Upstream SHA-256 matchedDownloade96061e0…aa27fb
0.5.0Cached · Upstream SHA-256 matchedDownload5eda445d…926448
0.5.1Cached · Upstream SHA-256 matchedDownloadf109066e…2a8dc8
0.6.0Cached · Upstream SHA-256 matchedDownload6a0e2c6b…01d4e9
0.6.1Cached · Upstream SHA-256 matchedDownload4c12553f…d498e1
1.0.0Cached · Upstream SHA-256 matchedDownloade9c2e658…0a21c0
1.0.1Cached · Upstream SHA-256 matchedDownload426f31d6…99c461
1.0.2Cached · Upstream SHA-256 matchedDownload622a9c05…c4299e
1.0.3Cached · Upstream SHA-256 matchedDownload5b5eaa48…209b6f
1.1.0Cached · Upstream SHA-256 matchedDownload6df0c8b9…b5f927
1.1.1Cached · Upstream SHA-256 matchedDownloadcab4ec7b…0e2a36
1.2.0Cached · Upstream SHA-256 matchedDownloadcc5e9c6e…d5ca31
1.2.1Cached · Upstream SHA-256 matchedDownload121ae72b…03a29d
1.2.2Cached · Upstream SHA-256 matchedDownloadddb07d0f…ac2803
1.2.3Cached · Upstream SHA-256 matchedDownload0ea81210…123e84
1.2.4Cached · Upstream SHA-256 matchedDownloade43d1f19…819c35
1.2.5Cached · Upstream SHA-256 matchedDownload6d80ee2e…5513fc
1.2.6Cached · Upstream SHA-256 matchedDownload8007a033…618a03
2.0.0-nullsafety.0Cached · Upstream SHA-256 matchedDownload8781f93b…3e8ba4
2.0.0-nullsafety.1Cached · Upstream SHA-256 matchedDownloadd6c95425…80675d
2.0.0-nullsafety.2Cached · Upstream SHA-256 matchedDownload538d7f4b…3f2adc
2.0.0-nullsafety.3Cached · Upstream SHA-256 matchedDownload71fde743…d892ee
2.0.0-nullsafety.4Cached · Upstream SHA-256 matchedDownloadd8033f6b…eaee33
2.0.0Cached · Upstream SHA-256 matchedDownload8867afc0…ec97a4
2.0.1Cached · Upstream SHA-256 matchedDownload14263956…074384
2.0.2Cached · Upstream SHA-256 matchedDownloadda851e4d…9d81cb
2.0.3Cached · Upstream SHA-256 matchedDownloadc6094fd1…add375
2.0.4Cached · Upstream SHA-256 matchedDownload42d13ad5…96feb7
2.0.5Cached · Upstream SHA-256 matchedDownloadc2b87cb7…5e3ca2
2.0.6Cached · Upstream SHA-256 matchedDownloadb35578f6…3fa000
2.0.7Cached · Upstream SHA-256 matchedDownload567c64b3…04aef7
2.0.8Cached · Upstream SHA-256 matchedDownload3e014150…1a3e2b
2.1.0-dev.0Cached · Upstream SHA-256 matchedDownloadf8b1ad1d…c42dc0
2.1.0Cached · Upstream SHA-256 matchedDownload3bce007a…c5eaa2
3.0.0-dev.0Cached · Upstream SHA-256 matchedDownload4f531ad0…83980a
3.0.0-dev.1Cached · Upstream SHA-256 matchedDownload0b8e50fa…653198
3.0.0Cached · Upstream SHA-256 matchedDownloadea36e500…be1702

Dependencies

collection "^1.14.11"