首页 > 解决方案 > 从目录中获取文件列表

问题描述

我正在尝试使用这种方法添加目录的内容并将其分配给 List 但不确定为什么它不起作用。我看到这是异步问题,但不知道如何解决它。我希望从 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;
}

标签: dart

解决方案


listen()返回 a StreamSubscription<FileSystemEntity>which is not aFuture所以你不能这样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;
}

推荐阅读