web-dev-qa-db-fra.com

type 'List <dynamic>' n'est pas un sous-type de type 'List <Widget>'

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?

33
Arash

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.

56
Jonah Williams

J'ai résolu mon problème en convertissant la carte en Widget

      children: snapshot.map<Widget>((data) => 
               _buildListItem(context, data)).toList(),
1
Popal