すらぼうの開発ノート

モバイルアプリエンジニアのメモ

【Flutter】equatableの使用方法

本エントリではequatableの使用方法を説明する。


eqatableとは?

pub.dev

equatableインスタンス同士を比較する処理を簡単に実装するパッケージ。

通常インスタンス同士の比較処理は==をoverrideして実装することが多い。ただしこの実装は煩雑な記述になることが多く、同じようなコードを何度も記述する必要があった。

そこでequatableを使用することで記述をシンプルかつ簡潔にすることができる。equatable==hashCodeを内部的にoverrideしてくれるのでユーザーがわざわざ煩雑な記述を何度も繰り返す手間を省ける。

使い方

公式のリポジトリにて記述されている例を題材とする。 以下のPersonクラスに比較用の==メソッドを実装していく。

class Person {
  const Person(this.name);

  final String name;
}

equatableを使用しない実装例

class Person {
  const Person(this.name);

  final String name;

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

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

このoperator ==という記法はあまり見かけないかもしれないが、==をoverrideする際に使用する。

api.dart.dev

なのでperson1person2というPersonインスタンスがあったとすると、以下のケースで

person1 == person2

trueになる。

しかし上記の通り若干コードが長くなり、なおかつ他のクラスでも似たような流れを記述する必要が出てくる。 そこでequatableを継承してPersonクラスを作成する。

equatableを使用した実装例

まずequatableをインストールする。

dependencies:
  equatable: ^2.0.5

次にPersonクラスを以下のように記述する。

import 'package:equatable/equatable.dart';

class Person extends Equatable {
  const Person(this.name);

  final String name;

  @override
  List<Object> get props => [name];
}

ポイントは

  @override
  List<Object> get props => [name];

の部分。これでnameプロパティの値が同じ時に==trueを返す。

このように見るとコードの記述量がかなり減っていることがわかる。

equatableの実行速度

equatableを使用しないで記述した場合と使用した場合を比較したデータが公式リポジトリに記載されている。

== でのインスタンス比較処理速度

Class Runtime (μs)
equatableなし 0.193
equatableあり(プロパティは未初期化) 0.191
equatableあり(プロパティは初期化済み) 0.190

このようにequatableを用いた方が処理速度的に若干有利であることがわかる。