Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart 从目录中获取文件列表_Dart - Fatal编程技术网

Dart 从目录中获取文件列表

Dart 从目录中获取文件列表,dart,Dart,我试图使用这种方法添加目录的内容,并将其分配到列表中,但不确定为什么它不起作用。我知道这是异步问题,但不确定如何解决。我希望从retCont()返回文件列表,但它返回的是空列表 import 'dart:io'; void main() async { print('CONT: ${await retCont()}'); } Future retCont() async { var myDir = Directory.current; List cont = []; awai

我试图使用这种方法添加目录的内容,并将其分配到列表中,但不确定为什么它不起作用。我知道这是异步问题,但不确定如何解决。我希望从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()

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;
}