您的示例没有多大意义,并且包含多个问题。放开他们每个人。
filesAndFolders 的类型问题
变量filesAndFolders 没有任何特定类型或使用值初始化。所以 Dart 在识别这个变量的类型时确实存在一些问题。如果您稍后在代码中使用此变量并认为它是某种列表,这对您没有帮助。
由于我们要保存路径列表,我们可以初始化我们的列表以包含如下字符串:
final filesAndFolders = <String>[];
向列表中添加元素时,您应该调用add(),例如:
filesAndFolders.add(entity.path);
异步和同步操作相结合
您正在对一个目录使用list 操作,该目录记录为返回Stream<FileSystemEntity>,这意味着我们将异步获取目录中的每个FileSystemEntity。
通过在Stream 上调用listen,您提供了一个回调方法,该方法将在Dart 从操作系统接收到文件列表时调用。因此,listen 调用不是同步的,Dart 只会在程序的其余部分中运行。
这就是您看到print(filesAndFolders); 在您的回调方法之前运行的原因。
此外,Dart 是单线程的,并且在后台使用事件队列。所以你给listen的回调方法只会在没有其他可以执行的情况下执行。
对此有两种解决方案:
同步。方式
您可以改用listSync 方法,它返回List<FileSystemEntity>,您可以通过正常的同步方式进行处理:
for (final entity in systemTempDir.listSync(recursive: false, followLinks: false)) {
print(entity.path);
}
异步。方式
Dart 允许我们标记一个方法async,它可以轻松指示我们何时想要异步等待某事发生。因此,我们可以将您的代码重写为:
void main() async {
...
await for (final entity in systemTempDir.list(recursive: false, followLinks: false)) {
print(entity.path);
}
}
通过使用await for,我们可以轻松订阅Stream,并在继续执行其余方法之前处理每个事件。
最终的方法在同步和异步中都是这样的:
同步
import 'dart:io';
void main() {
final filesAndFolders = <String>[];
final systemTempDir = Directory(".");
for (final entity in systemTempDir.listSync(recursive: false, followLinks: false)) {
print(entity.path);
filesAndFolders.add(entity.path);
}
print(filesAndFolders);
}
异步
import 'dart:io';
void main() async {
final filesAndFolders = <String>[];
final systemTempDir = Directory(".");
await for (final entity in systemTempDir.list(recursive: false, followLinks: false)) {
print(entity.path);
filesAndFolders.add(entity.path);
}
print(filesAndFolders);
}