【flutter】dartのコレクションで比較する際の注意

1 min read読了の目安(約1100字

結論

dart のコレクションを==で比較するのはやめた方がいいです。思わぬバグを生みます。
==で比較せず、listEquals、setEquals、mapEqualsを使用する。

コレクション比較試してみた

list, set, mapで比較してみました。

サンプルコード

import 'package:flutter/foundation.dart';

void main() {
  final listA = [1, 2, 3, 4, 5];
  final listB = [1, 2, 3, 4, 5];

  print('listA == listB ${listA == listB}');
  print('listEquals(listA, listB) ${listEquals(listA, listB)}');

  final setA = {'A', 'B', 'C'};
  final setB = {'A', 'B', 'C'};

  print('setA == setB ${setA == setB}');
  print('setEquals(setA, setB) ${setEquals(setA, setB)}');

  final mapA = {1: 'A', 2: 'B', 3: 'C'};
  final mapB = {1: 'A', 2: 'B', 3: 'C'};

  print('mapA == mapB ${mapA == mapB}');
  print('mapEquals(mapA, mapB) ${mapEquals(mapA, mapB)}');
}

実行結果

flutter: listA == listB false
flutter: listEquals(listA, listB) true
flutter: setA == setB false
flutter: setEquals(setA, setB) true
flutter: mapA == mapB false
flutter: mapEquals(mapA, mapB) true

参考

https://api.flutter.dev/flutter/foundation/listEquals.html
https://api.flutter.dev/flutter/foundation/setEquals.html
https://api.flutter.dev/flutter/foundation/mapEquals.html