Получить список файлов из каталога - PullRequest
0 голосов
/ 02 августа 2020

Я пытаюсь добавить содержимое каталога, используя этот подход, и присвоить его списку, но не уверен, почему он не работает. Я вижу проблему asyn c, но не знаю, как ее решить. Я ожидаю вернуть список файлов из retCont (), но вместо этого он возвращает пустой список.

import 'dart:io';

void main() async {
  print('CONT: ${await retCont()}');
}

Future retCont() async {
  var myDir = Directory.current;
  List cont = [];
  await myDir.list().listen((FileSystemEntity entity) {
    print(entity.path);
    cont.add(entity.path);
  });
  return cont;
}

1 Ответ

1 голос
/ 02 августа 2020

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...