🦧
FirestoreでMap型を取得する方法
目的
Firestoreからいつものように値を取得しようとしているとエラーが出たのでその解決策をまとめてみます。
データの構造
サッカーチームの試合のデータとして
fieldにnowSeason(マップ型)とsumSeason(マップ型)があります。
それぞれの今シーズンと全シーズンのデータを取得します。
サンプルコード
たとえでサッカーの試合データを作りました。今シーズンのデータと全シーズンのデータを用意
データはゴール数、試合数、勝点、勝利数を作成
Repository(FirebaseのCRUD)でGradeModel.fromFirestoreを呼び出します。
モデルのファイルより
gradeModel.dart
class GradeModel {
final NowSeason nowSeason;
final SumSeason sumSeason;
GradeModel({
required this.nowSeason,
required this.sumSeason,
});
factory GradeModel.fromFirestore(DocumentSnapshot snapshot) {
return GradeModel(
nowSeason: NowSeason.fromFirestore(snapshot['nowSeason']),
sumSeason: SumSeason.fromFirestore(snapshot['sumSeason']),
);
}
}
sumSeason.dart
省略
factory SumSeason.fromFirestore(DocumentSnapshot snapshot) {
return SumSeason(
correct: snapshot['goal'] as int,
game: snapshot['game'] as int,
bestPoint: snapshot['point'] as int,
win: snapshot['win'] as int,
);
}
nowSeason.dart
省略
factory NowSeason.fromFirestore(DocumentSnapshot snapshot) {
return NowSeason(
correct: snapshot['goal'] as int,
game: snapshot['game'] as int,
point: snapshot['point'] as int,
win: snapshot['win'] as int,
);
}
Repository(FirebaseのCRUD)でGradeModel.fromFirestoreを呼び出します。
これで動かしてみるとRepositoryのCRUD関数で下記のエラーが出ます。
'_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'DocumentSnapshot<Object?>'
マップ型のsnapshotを取得するときは
NowSeason.fromFirestore,SumSeason.fromFirestoreがGradeModelからDocumentSnapshot型を受け取っていますがここが
_InternalLinkedHashMap<String, dynamic>
でないといけないと怒られています。
なので受け取る方をDocumentSnapshot型からdynamic型にしてみます。
sumSeason.dart
省略
factory SumSeason.fromFirestore(dynamic snapshot) {
return SumSeason(
correct: snapshot['goal'] as int,
game: snapshot['game'] as int,
bestPoint: snapshot['point'] as int,
win: snapshot['win'] as int,
);
}
nowSeason.dart
省略
factory NowSeason.fromFirestore(dynamic snapshot) {
return NowSeason(
correct: snapshot['goal'] as int,
game: snapshot['game'] as int,
point: snapshot['point'] as int,
win: snapshot['win'] as int,
);
}
そうすると正常に取得することができました。
Discussion