2

我正在创建一个控制台应用程序来使用以下代码读取本地文件:

注意:我需要将结果存储到列表中,以便稍后在代码中使用它。打印只是我以后想用它做的一个例子。而且我不能在文件读取例程中做所有事情。我稍后需要访问列表。

var text = new List();
var config = new File("myfile.txt");
config.readAsLines(Encoding.ASCII).then((List<String> lines) {
  text.add(lines);
});

for (var l in text) print (l);

显然这行不通,这样的事情是我真正不喜欢飞镖的地方。那么在不使用同步的情况下我应该怎么做呢?sync 不好,因为我需要在“main”部分中编写此代码,而不需要调用任何 void 来处理输入。此外,如果我使用同步并循环选择目录中的文件并尝试将其添加到列表并打印输出,它将重复打印目录中第一个文件的输出。

那么是否有某种“技巧”可以使这项工作成为我尝试的方式?任何其他脚本语言中的这种严格的简单操作在 dart 中都不那么严格:(

4

1 回答 1

2

dart 中的许多 API 都使用异步操作。通常,此操作返回Future。一旦运算结果可用,Future.then就会调用 at 给出的函数。

在您的示例中,在之后text.add(lines)调用,因此当您尝试读取其内容时列表仍然为空。为了使您的代码工作,您必须将 放入回调函数中。就像是 : for (var l in text) print (l);textprint

main() {
  var config = new File("myfile.txt");
  config.readAsLines(Encoding.ASCII).then(handleLines);
}

handleLines(List<String> lines) {
  for (var l in lines) print(lines);
}

您还可以使用异步File函数的同步版本。特别是readAsLinesSync ,它是readAsLines的同步版本。使用该版本,您的代码可以是:

main() {
  var config = new File("myfile.txt");
  List<String> lines = config.readAsLinesSync(Encoding.ASCII);
  for (var l in lines) print (l);
}
于 2013-01-15T08:18:21.620 回答