Dart Data Class で生成できるコードを自分好みにした
オブジェクトクラスの自動生成って、
Freezed
Dart Data Class
これ以外に、何があるんだろうか?
ちょっと変数の宣言をして、プラグインやコマンドを打ち込んだら
自動で生成されるコードで凄く便利だけど
どう頑張っても自分好みに仕上げるためには、最後に一手間加える必要がありますよね
それも、変数を増やしたり減らしたりして、再生成したときに
一手間加えた分も全てやり直す必要性があるから何気面倒・・・
と、ずっと思っていたので、作ってしまいました。
・ 変数名
・ 型
・ Null or 必須
を入れるだけで
toMap , fromMap , copyWith
が 『自分好み』 に作れるようになった。
toMapの違う点
toMapメソッドを発火させる時って、
既に入ってる変数をそのまま入れる形になってたけど
最近になって、DateTime.now()ってのがちゃんとした日付を取得してくれないことに気がついたから
FieldValue.serverTimestamp()
を最初から入れたくなったんだよね。
なので、シートE列目でドロップダウンボタンを押した時に、
必要な箇所には、FieldValue.serverTimestamp()が入るようにしてある。
もし、空欄の場合は従来通りの変数がそのまま入るから安心
イメージはこんな感じ↓
Map<String, dynamic> toMap() {
return {
'userId': userId,
'createdAt': FieldValue.serverTimestamp(),
};
}
ちなみに、FieldValue.serveTimestamp()以外にも、自分のオリジナルを入れたい場合は
「rule」っていうタブから、「toJson Default」という列に入れるとそれがドロップダウンで反映されるようにしています。
fromMapの違う点
- Null対応している
- 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