listen()
возвращает StreamSubscription<FileSystemEntity>
, который не является Future
, поэтому вы не можете await
на этом.
Вызов list()
возвращает Stream<FileSystemEntity>
. Для потоков вы можете вместо await
и listen()
использовать await for
вот так:
import 'dart:io';
Future<void> main() async {
print('CONT: ${await retCont()}');
}
Future<List<String>> retCont() async {
final myDir = Directory.current;
final cont = <String>[];
await for (final entity in myDir.list()) {
print(entity.path);
cont.add(entity.path);
}
return cont;
}
И как бонус, ту же программу можно написать так, если вы пропустите print(entity.path);
.
import 'dart:io';
Future<void> main() async {
print('CONT: ${await retCont()}');
}
Future<List<String>> retCont() =>
Directory.current.list().map((event) => event.path).toList();
Если вы действительно хотите использовать StreamSubscription
, я думаю, что самый простой способ - использовать экземпляр Completer
, который вы можете завершить, когда у вас есть все элементы из List()
:
import 'dart:async';
import 'dart:io';
Future<void> main() async {
print('CONT: ${await retCont()}');
}
Future<List<String>> retCont() {
final myDir = Directory.current;
final cont = <String>[];
final completer = Completer<List<String>>();
myDir.list().listen((FileSystemEntity entity) {
print(entity.path);
cont.add(entity.path);
}, onDone: () => completer.complete(cont));
return completer.future;
}