web-dev-qa-db-ja.com

Flutter Cloud Firestore Map <String、dynamic>エラー

FlutterとFirestoreを使用してアプリを構築しようとしています。 StreamBuilderを使用してListstoreで表示するコレクションをFirestoreからロードすると、次のエラーが表示されます

The following assertion was thrown building StreamBuilder<QuerySnapshot>(dirty, state:
I/flutter (26287): _StreamBuilderBaseState<QuerySnapshot, AsyncSnapshot<QuerySnapshot>>#d5638):

I/flutter (26287): type '_InternalLinkedHashMap<dynamic, dynamic>' is not a subtype of type 'Map<String, dynamic>'

I/flutter (26287): where

I/flutter (26287):   _InternalLinkedHashMap is from Dart:collection

I/flutter (26287):   Map is from Dart:core

I/flutter (26287):   String is from Dart:core

これは、DocumentSnapshotからデータを取得する方法です。

class Creator {
  const Creator({this.creatorId, this.name});

  Creator.fromDoc(DocumentSnapshot doc) : this.fromMap(doc.data);

  Creator.fromMap(Map<String, dynamic> map) :
    assert(map.containsKey('creatorId'),
    assert(map.containsKey('name'),
    this ( creatorId: map['creatorId'], name: map['name'] );

  /*

  ...

  */
}

そして、私はそれをどのように使いたいか

return Scaffold(
  appBar: AppBar(title: new Text('Creators')),
  body: StreamBuilder<QuerySnapshot>(
    stream: CreatorRepo.getCreators().map<List<Creator>>((creators) {
      return creators.documents.map<Creator>((c) => Creator.fromSnapshot(c)).toList();
    }),
    builder: (BuildContext context, snapshot) {
      if ( snapshot.hasData ) {
        return ListView.builder(
          itemCount: snapshot.data.length,
          builder: (context, index) {
            final creator = snapshot.data[index];

            return ExpansionTile(
              title: Text(creator.name),
              children: [
                Text(creator.creatorId),
              ],
            );
          },
        );
      }

      return const CircularProgressIndicator();
    },
  ),
);

依存関係:

dependencies:
  flutter:
    sdk: flutter

  cloud_firestore: ^0.6.3
  firebase_messaging: ^0.2.4

Firestoreでは、Stringキーとdynamic値(Timestampを除く)のみをコア言語タイプとして使用できます。 cloud_firestoreプラグインは、ドキュメントデータを_InternalLinkedHashMap<dynamic, dynamic>。すべてのMap内のDocumentSnapshotMap<String, dynamic>。これを回避するにはどうすればよいですか?すべての関数を変更してMap<dynamic, dynamic>そして、キーがStringであると仮定すると、問題のややugい回避策になります。

5
Johann Feser

これは、Firebaseから返されるマップがMap<String, dynamic> 代わりに Map<dynamic, dynamic>

関連する問題については、 https://github.com/flutter/flutter/issues/17417 を参照してください。

8
Kevin Moore

Map<String, dynamic>.from ( mapFromFirestore )を使用します。これにより、新しいMap<String, dynamic>mapFromFirestoreのコンテンツから、String以外のキーが見つかった場合にエラーをスローします。

4
Michael P.

FlutterはMap<String,String>

1
Sunil

私もこの問題を抱えていて、それを修正しました-

  Map<String, dynamic> var = {'item': 0, 'name': 'John'}  

未指定のMapの代わりに。

  Map var = {'item': 0, 'name': 'John'}  
0
Jamie T