Исключение при перечислении созданного подкаталога в каталог документов - PullRequest
0 голосов
/ 15 сентября 2018

Я использую официальный API для отображения каталога, который я создал для какой-то цели, и поместил в него несколько файлов.Теперь я хочу перечислить их.

Вот как я создаю сначала

final Directory extDir = await getApplicationDocumentsDirectory();
//    final String dirPath = '${extDir.path}/Movies/flutter_test';
final String dirPath = '${extDir.path}/mydir';
await new Directory(dirPath).create(recursive: true);

Вот что я делаю, чтобы читать на другой странице.

final Directory extDir = await getApplicationDocumentsDirectory();
//    final String dirPath = '${extDir.path}/Pictures/flutter_test';
final String dirPath = '${extDir.path}/mydir';
final String thumbDirPath = '$dirPath/thumbs';
final Directory imgDir = Directory.fromUri(Uri.file(dirPath));

dirExists = imgDir.existsSync();
fileCount = 0;
if(dirExists) {
  print("my dir exists");

//      thumbDir.list(recursive: false, followLinks: false)
  fileCount = await imgDir.list(recursive: false).length;
  print('mydir images count $fileCount');
  if(fileCount > 1) { // we think one is always the directory itself?
    try {
      imgDir.list(recursive: false, followLinks: false)
          .listen((FileSystemEntity entity) {

Код разбивается здесь, выдавая следующее исключениесообщение

type '() => Null' is not a subtype of type '(Object) => FutureOr<dynamic>'

Я должен также сказать, что этого не происходит, когда я перечисляю каталог внешнего хранилища.Я делаю что-то не так при создании своего каталога?

EDIT

Я теперь обновил флаттер до 0.7.3 на моем Mac, и у меня возникла новая проблема.Приложение не будет работать вообще.

1 Ответ

0 голосов
/ 17 сентября 2018

Хорошо, я сам нашел решение. Видимо, работа с API большого провайдера дала мне другой способ перечисления элементов, который фактически сказал мне, что я пытался запустить слушатели дважды.

fileCount = await imgDir.list(recursive: false).length;

и

imgDir.list(recursive: false, followLinks: false)
      .listen((FileSystemEntity entity) {

из исходного кода нельзя записать один за другим, так как первый заканчивает работу слушателя. Об этом я узнал, изменив собственный код и перечислив каталоги таким образом.

Stream<FileSystemEntity> files = imgDir.list(recursive: false, followLinks: false);

добавит столько событий, сколько файлов в соответствии с API .., а затем создаст обычный общий список

List<FileSystemEntity> entities = await files.toList();

и затем вы выполняете обычную итерацию, используя итератор или цикл for (), как

for(FileSystemEntity entity in entities) {
... // every file now is available
...