J'ai un extrait de code que j'ai copié à partir de l'exemple Firestore:
Widget _buildBody(BuildContext context) {
return new StreamBuilder(
stream: _getEventStream(),
builder: (context, snapshot) {
if (!snapshot.hasData) return new Text('Loading...');
return new ListView(
children: snapshot.data.documents.map((document) {
return new ListTile(
title: new Text(document['name']),
subtitle: new Text("Class"),
);
}).toList(),
);
},
);
}
Mais je reçois cette erreur
type 'List<dynamic>' is not a subtype of type 'List<Widget>'
Qu'est-ce qui ne va pas ici?
Le problème ici est que l'inférence de type échoue de manière inattendue. La solution consiste à fournir un argument de type à la méthode map
.
snapshot.data.documents.map<Widget>((document) {
return new ListTile(
title: new Text(document['name']),
subtitle: new Text("Class"),
);
}).toList()
La réponse la plus compliquée est que, bien que le type de children
soit List<Widget>
, cette information ne retourne pas vers l'invocation map
. Cela peut être dû au fait que map
est suivi de toList
et qu’il n’ya aucun moyen de saisir, annoter, le retour d’une fermeture.
J'ai résolu mon problème en convertissant la carte en Widget
children: snapshot.map<Widget>((data) =>
_buildListItem(context, data)).toList(),