Dart 从目录中获取文件列表
我试图使用这种方法添加目录的内容,并将其分配到列表中,但不确定为什么它不起作用。我知道这是异步问题,但不确定如何解决。我希望从retCont()返回文件列表,但它返回的是空列表Dart 从目录中获取文件列表,dart,Dart,我试图使用这种方法添加目录的内容,并将其分配到列表中,但不确定为什么它不起作用。我知道这是异步问题,但不确定如何解决。我希望从retCont()返回文件列表,但它返回的是空列表 import 'dart:io'; void main() async { print('CONT: ${await retCont()}'); } Future retCont() async { var myDir = Directory.current; List cont = []; awai
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()
list()
调用返回Stream
。对于流,您可以不使用wait
和listen()
而使用wait 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;
}
如果您真的想使用StreamSubscription
,我认为最简单的方法是使用Completer
实例,当您从List()
获得所有元素后,就可以完成该实例:
导入'dart:async';
导入“dart:io”;
Future main()异步{
打印('CONT:${await retCont()}');
}
未来retCont(){
final myDir=Directory.current;
最终控制=[];
最终完成者=完成者();
myDir.list().listen((文件系统实体){
打印(实体路径);
cont.add(实体路径);
},onDone:()=>completer.complete(cont));
返回completer.future;
}
看看这个:这能回答你的问题吗?在本例中,如果要将流的所有数据添加到列表中,最好使用:var list=wait myDir.list().toList()代码>@julemand101谢谢你的回答。我们可以使用StreamSubscription实现相同的结果吗???如果可以,请提供使用StreamSubscription
的示例。如果不使用StreamSubscription
,则很可能根本不使用listen
,而是使用forEach
。在本例中:返回myDir.list().forEach((entity){cont.add(entity.path);})代码>--不需要补全符。或者可能返回myDir.list().fold([],(list,entity)=>list..add(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();
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;
}