Type 'List <dynamic>' не является подтипом типа 'List <Widget>'

У меня есть фрагмент кода, который я скопировал из примера 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(),
        );
      },
    );
  }

Но я получаю эту ошибку

type 'List<dynamic>' is not a subtype of type 'List<Widget>'

Что здесь не так?

Ответ 1

Проблема заключается в том, что вывод типа неожиданно завершается. Решение заключается в предоставлении аргумента типа методу map.

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

Более сложный ответ заключается в том, что, если тип children равен List<Widget>, эта информация не возвращается к вызову map. Это может быть связано с тем, что за map следует toList и потому, что нет способа ввести аннотацию возврата замыкания.

Ответ 2

Я решил свою проблему, преобразовав Map в Widget

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

Ответ 3

Вы можете привести динамический список к списку с определенным типом:

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