dartでなるべくfinalを使いたい!

こんにちは、 id:takkumattsu です。 最近はコベリンでもflutterの案件が増えてきてました。

今回はいわゆるデータクラスを使う時のノウハウを書いていこう思います!

データクラスでなるべくfinalをつけたい!

今回は以下みたいなListViewに渡すデータを一つにまとめた ListItem というクラスを例にとって説明していきたいと思います。

上のセルの表示に必要なデータはこんな感じになるかと思います。

class ListItem {
  String title;
  String thumbnailUrl;
  String text;
  String author;
  String get body => text + " by " + author;
}

ListItemは初期化時に値を設定できるように制限したいですよね。

class ListItem {
  final String title;
  final String thumbnailUrl;
  String _text;
  String _author;
  String get body => _text + " by " + _author;
  ListItem(
      {@required this.title,
      @required this.thumbnailUrl,
      @required String text,
      @required String author}) {
    _text = text;
    _author = author;
  }
}

これで初期化時のみだけ値が設定されるように変更出来ました。
ただprivateな変数である_text_authorはfinalがつけられません。
やろうとすると以下のようにエラーになります。

ぐぬぬ...

initializer listを使う!

initializer listを使うことでfinalをつけることができます!

class ListItem {
  final String title;
  final String thumbnailUrl;
  final String _text;    // うれぴー😆
  final String _author;  // うれぴー😆
  String get body => _text + " by " + _author;
  ListItem(
      {@required this.title,
      @required this.thumbnailUrl,
      @required String text,
      @required String author})
      : _text = text,
        _author = author;
}

// もっというとprivateな変数をなくして、bodyも変数にしちゃってもいいかもですね
class ListItem {
  final String title;
  final String thumbnailUrl;
  final String body;
  ListItem(
      {@required this.title,
      @required this.thumbnailUrl,
      @required String text,
      @required String author})
      : body = text + " by " + author;
}

やったね!

これで全ての変数にfinalをつけることが出来ました!
データクラスはなるべくイミュータブルな方がバグが入りにくいのでどんどん活用していきたいです!