Help us understand the problem. What is going on with this article?

Dartにはdata classはない

環境

訳あって最新版を使っていません(macをCatalinaにアップデートできない==Xcodeの最新版を入れられないので)。
従って、バージョン違いによる不動作などあるかも知れません。お気づきの点があったら是非コメント下さい。

$ flutter --version
Flutter 1.12.13+hotfix.5 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 27321ebbad (4 months ago) • 2019-12-10 18:15:01 -0800
Engine • revision 2994f7e1e6
Tools • Dart 2.7.0

要点

Dartには、Kotlinで便利なdata classがありません。
その結果何が起こるかというと、operator==hashCodetoStringなどを全部自分で書かないと行けないと言うことです。Java時代のあの苦労よもう一度、というわけです。

それを知らないでKotlinのノリでUnitTest書いていたら全然パスしなくてググりました(汗)

下記のパッケージを使うという手もあるようですが、ちょっと多機能すぎる気がして、私は使うのを見送りました。

ちなみに、公式に議論はされているようです。
https://github.com/dart-lang/language/issues/314

以下テンプレ作ったので良ければ使って下さい。

class ClassA{
  double valueA;
  String valueB;
  Map<String, String> map;

  @override
  bool operator ==(Object other) {
    return other is ClassA &&
        valueA == other.valueA &&
        valueB == other.valueB &&  // 文字列も`==`での比較でOK
        mapEquals(map, other.map); // Deep比較してくれる。ListにはlistEqualsがある
  }

  @override
  int get hashCode => valueA.hashCode ^ valueB.hashCode ^ map.hashCode;

  @override
  String toString() {
    return "$valueA, $valueB, $map";
  }
}

参考

Stringのoperator==をテストした時のコード

import 'package:flutter_test/flutter_test.dart';
import 'package:matcher/matcher.dart';

void main() {
 group("Stringのテスト", () {
    test('operator ==:a,b==null', () {
      String a;
      String b;
      expect(a==b, isTrue);
    });
    test('operator ==:a,b have same String', () {
      String a="abs";
      String b="abs";
      expect(a==b, isTrue);
    });
    test('operator ==:a,b are same Instance', () {
      String a="abs";
      String b=a;
      expect(a==b, isTrue);
    });
    test('operator ==:a==null', () {
      String a;
      String b="abs";
      expect(a==b, isFalse);
    });
    test('operator ==:a==null', () {
      String a="abs";
      String b;
      expect(a==b, isFalse);
    });
    test('operator ==:a,b have NOT same String', () {
      String a="abs";
      String b="abc";
      expect(a==b, isFalse);
    });
  });
}

Matcherライブラリpubspec.yamlに以下のように追記します。

pubspec.yaml
dev_dependencies:
  flutter_test:
    sdk: flutter

  # matcher
  matcher: ^0.12.6

参考サイト

Dart で簡単に data class を作りたい
https://hisaichi5518.hatenablog.jp/entry/2019/12/02/205539

kasa_le
言語経験はC→C++→Java+Android(たまにiOS/swift経験なし)→Kotlin Flutterも良いよ. 独学でPHPとpython
Leading-Edge
ITエンジニアの生涯価値向上を目指し、派遣・紹介・教育・自社開発など様々な分野から全方位支援を行っております。
https://www.leadinge.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away