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
内のDocumentSnapshot
はMap<String, dynamic>
。これを回避するにはどうすればよいですか?すべての関数を変更してMap<dynamic, dynamic>
そして、キーがString
であると仮定すると、問題のややugい回避策になります。
これは、Firebaseから返されるマップがMap<String, dynamic>
代わりに Map<dynamic, dynamic>
。
関連する問題については、 https://github.com/flutter/flutter/issues/17417 を参照してください。
Map<String, dynamic>.from ( mapFromFirestore )
を使用します。これにより、新しいMap<String, dynamic>
はmapFromFirestore
のコンテンツから、String
以外のキーが見つかった場合にエラーをスローします。
FlutterはMap<String,String>
私もこの問題を抱えていて、それを修正しました-
Map<String, dynamic> var = {'item': 0, 'name': 'John'}
未指定のMapの代わりに。
Map var = {'item': 0, 'name': 'John'}