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));