'for'循环必须在 Future 函数上实现'Iterable<dynamic>'



我试图返回一个映射,但我试图迭代列表的方式,但我在列表上集成的方式导致了问题。

我收到这个错误错误:类型"Future<列表>"for"循环中使用的Function((必须实现"Iterable"。

///Model Event  
class Event {
final int id;
final bool free;
final String epoch;
final String address;
final bool all_day;
final String end_date;
final String description;
final String start_date;
Event(
this.id,
this.free,
this.epoch,
this.address,
this.all_day,
this.end_date,
this.description,
this.start_date,
);
@override
String toString() =>
"$id, $free, $epoch, $address, $all_day, $end_day, $description, $start_date";
}

这将返回一个List<事件>

///Future to get information from the API
Future<List<Event>> eventList() async {
var response = await http.get(Uri.parse(Constants.EVENTS_API));
if (response.statusCode == 200) {
var jsonData = json.decode(response.body);
//print(jsonData);
List<Event> allEvents = [];
for (var map in jsonData) {
Event events = Event(
map["id"],
map["free"],
map["epoch"],
map["address"],
map["all_day"],
map["end_date"],
map['description'],
map["start_date"],
);
allEvents.add(events);
}
return allEvents;
} else {
throw Exception('Failed to load');
}
}

然后我试着把它添加到一个新的地图中

mydates() {
var eventDayMap = <DateTime, List<Event>>{};
for (var event in eventList()) {
(eventDayMap[DateTime.parse(event.start_date)] ??= []).add(event);
}
return eventDayMap;
}

mydates函数从这里调用

final kEvents = LinkedHashMap<DateTime, List<Event>>(
equals: isSameDay,
hashCode: getHashCode,
)..addAll(mydates());

这是接收kEvents 的函数

List<Event> _getEventsForDay(DateTime day) {

return kEvents[day] ?? [];
}

我要做些什么来实现一个"Iterable<动态>',像值或键这样的可迭代项不起作用。

感谢

eventList()函数返回一个Future,它返回一个列表,因此不能在for循环中直接使用它。尝试这样更改mydates()

Future<Map<DateTime, List<Event>>> mydates() async {
var eventDayMap = <DateTime, List<Event>>{};
List<Event> _allEvents = await eventList();
for (var event in _allEvents) {
(eventDayMap[DateTime.parse(event.start_date)] ??= []).add(event);
}
return eventDayMap;
}

或:

Future<Map<DateTime, List<Event>>> mydates() async {
var eventDayMap = <DateTime, List<Event>>{};
for (var event in await eventList()) {
(eventDayMap[DateTime.parse(event.start_date)] ??= []).add(event);
}
return eventDayMap;
}

更新:在您调用mydates()函数的地方,您需要awaitit

Map<DateTime, List<Event>> _myDates = await mydates();
final kEvents = LinkedHashMap<DateTime, List<Event>>(
equals: isSameDay,
hashCode: getHashCode,
)..addAll(_myDates);

late LinkedHashMap<DateTime, List<Event>> kEvents;
mydates().then((_myDates) {
if(_myDates != null) {
kEvents = LinkedHashMap<DateTime, List<Event>>(
equals: isSameDay,
hashCode: getHashCode,
)..addAll(_myDates);
}
});

我还根据评论的建议,在上面的函数中添加了返回类型


最新更新