dart - 从目录中获取文件列表
问题描述
我正在尝试使用这种方法添加目录的内容并将其分配给 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;
}
解决方案
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;
}
推荐阅读
- flutter - 如何防止水平 ListView 项目拉伸
- html - 将子元素设置为父元素的 100% 高度,而不考虑其他兄弟元素
- java - How to enable Maintenance mode in spring boot
- javascript - vue 组件数据和计算属性
- java - 使用 Java Stream 从 ArrayList 获得最高分
- dart - TextField 的自动对焦属性导致小部件进入“脏”状态
- python - 在 numpy 数组中切片和在 Python 中切片列表有什么区别?
- spring - 在 AWS Lambda Spring boot 中加载自定义 ApplicationContextInitializer
- javascript - 如何在节点 js 中使用带有 sendgrid 的模板发送电子邮件
- google-app-engine - 无法使用 API KEY 连接到 GCP mysql 数据库,错误:请求中指定的项目无效