🦔

Dart Data Class で生成できるコードを自分好みにした

2023/01/06に公開

オブジェクトクラスの自動生成って、

Freezed
Dart Data Class

これ以外に、何があるんだろうか?

ちょっと変数の宣言をして、プラグインやコマンドを打ち込んだら
自動で生成されるコードで凄く便利だけど
どう頑張っても自分好みに仕上げるためには、最後に一手間加える必要がありますよね

それも、変数を増やしたり減らしたりして、再生成したときに
一手間加えた分も全てやり直す必要性があるから何気面倒・・・

と、ずっと思っていたので、作ってしまいました。

https://docs.google.com/spreadsheets/d/1KMaHtDSRXwyJ5I8OhceWkfNt-oa_zTff5YkVnlo7vsI/edit#gid=1779079005

・ 変数名
・ 型
・ Null or 必須

を入れるだけで

toMap , fromMap , copyWith

が 『自分好み』 に作れるようになった。

toMapの違う点

toMapメソッドを発火させる時って、
既に入ってる変数をそのまま入れる形になってたけど
最近になって、DateTime.now()ってのがちゃんとした日付を取得してくれないことに気がついたから

FieldValue.serverTimestamp()

を最初から入れたくなったんだよね。

なので、シートE列目でドロップダウンボタンを押した時に、
必要な箇所には、FieldValue.serverTimestamp()が入るようにしてある。

もし、空欄の場合は従来通りの変数がそのまま入るから安心
イメージはこんな感じ↓

Dart
Map<String, dynamic> toMap() {
    return {
      'userId': userId,
      'createdAt': FieldValue.serverTimestamp(),
    };
  }

ちなみに、FieldValue.serveTimestamp()以外にも、自分のオリジナルを入れたい場合は
「rule」っていうタブから、「toJson Default」という列に入れるとそれがドロップダウンで反映されるようにしています。

fromMapの違う点

  1. Null対応している
  2. Timestamp型でもDateTime型に変えている
変更前
factory Test123.fromMap(Map<String, dynamic> map) {
    return Test123(
      userId: map['userId'] as String,
      createdAt: map['createdAt'] as DateTime,
    );
  }
変更後
factory Test123.fromMap(Map<String, dynamic> map) {
    return Test123(
      userId: map['userId'] as String?,
      createdAt: map['createdAt']?.toDate(),
    );
  }

copyWithは全く同じ作り

これは変えるべきところがなかったので変更してませんが、
必須のメソッドなので突っ込んでいます。

懸念点

final DateTime createdAt;
  final DateTime? updatedAt;
  const Test123({
    required this.createdAt,
    this.updatedAt,
  });
  Test123 copyWith({
    DateTime? createdAt,
    DateTime? updatedAt,
  }) {
    return Test123(
      createdAt: createdAt ?? this.createdAt,
      updatedAt: updatedAt ?? this.updatedAt,
    );
  }

コンストラクタとcopyWithがくっ付いていて気持ち悪い
ところくらいでしょうか

改行させろと思うかもしれませんが、そうなると
1手間2手間をご自身で作ってもらう必要があって
そっちの方が面倒だなと思ったので良い案が思いつくまではこうなりそうです。
力不足ですみません><

まぁ、自作なのでまだまだ改良の余地はありますがもし使えそうでしたら使ってみてくださいmm

Discussion