207 votes

le type 'List<dynamic>' n'est pas un sous-type du type 'List<Widget>'.

J'ai un bout de code que j'ai copié de l'exemple de 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 ?

412voto

Jonah Williams Points 7627

Le problème ici est que l'inférence de type échoue d'une manière inattendue. La solution consiste à fournir un argument de type à la fonction map méthode.

snapshot.data.documents.map<Widget>((document) {
  return new ListTile(
    title: new Text(document['name']),
    subtitle: new Text("Class"),
  );
}).toList()

La réponse plus compliquée est que, bien que le type de children est List<Widget> cette information n'est pas renvoyée vers l'entreprise. map invocation. Cela peut être dû au fait que map est suivi par toList et parce qu'il n'y a aucun moyen d'annoter le retour d'une fermeture.

36voto

C developer Points 1

Vous pouvez couler une liste dynamique vers une liste avec un type spécifique :

List<'YourModel'>.from(_list.where((i) => i.flag == true));

31voto

Popal Points 91

J'ai résolu mon problème en convertissant Map à Widget

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X