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などで持たせるよりもクラス内で定義することによって保守性の高いコードになったかと思います