O que acontece se você precisar fazer um loop em um iterável e executar uma função que retorna um futuro em cada item?
Se não estiver preocupado com a ordem em que os resultados são retornados, você pode usar Future.wait e mapear o iterável assim:
Future<String> doSomething() {
var completer = new Completer();
List v = [];
v['something'] = 'something';
Future.wait(my_list.map((item) => item.itemFunc())).then((List results) {
v['results'] = results;
var str = JSON.encode(v);
completer.complete(str);
}).catchError((e) {
print('There was an error: $e');
completer.complete('');
});
return completer.future;
}