0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

freezedパッケージでモデルクラスの数字Enumに意味を持たせたい

Posted at

Firestoreの構造

下記のようにtypeがFirestore上ではnumberで管理されている場合。
Flutter側では、数値から表示する文字列へ変換する場合がある。

フィールド名 デフォルト値 説明
docId String '' ドキュメントID
type int 0 0:未選択、1:タイプ1、2:タイプ2、3:タイプ3

freezedで定義するクラス内で表示用メソッドを作成する

import 'package:cloud_firestore/cloud_firestore.dart';

part 'your_data.freezed.dart';
part 'your_data.g.dart';

// enumでtypeを表現
enum YourDataType {
  notSelected(0, '未選択'),
  type1(1, 'タイプ1'),
  type2(2, 'タイプ2'),
  type3(3, 'タイプ3');

  final int value;
  final String displayName;

  const YourDataType(this.value, this.displayName);

  static YourDataType fromInt(int value) {
    return YourDataType.values.firstWhere((e) => e.value == value, orElse: () => YourDataType.notSelected);
  }

  @override
  String toString() => displayName;
}

@freezed
class YourData with _$YourData {
  const factory YourData({
    @Default('') String docId,
    @Default(0) int type, // 0:未選択、1:タイプ1、2:タイプ2、3:タイプ3
  }) = _YourData;

  factory YourData.fromJson(Map<String, dynamic> json) => _$YourDataFromJson(json);
}

// 拡張関数
extension YourDataEx on YourData {
  String get typeString => YourDataType.fromInt(type).toString();
}

使用

    YourData data = YourData(type: 1);
    print(data.typeString); // "タイプ1"

感想

typeを変換するメソッドをそれぞれのviewや、utilなどで持たせるよりもクラス内で定義することによって保守性の高いコードになったかと思います

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?