🦧

FirestoreでMap型を取得する方法

2021/11/15に公開約2,200字

目的

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

ログインするとコメントできます