我正在创建一个控制台应用程序,使用以下代码读取本地文件:
注意:我需要将结果存储到List中,以便稍后在代码中使用它。打印只是我以后想要用它做的一个例子。我无法在文件读取例程中做所有事情。我需要稍后访问List。
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);
显然这不会起作用,像这样的事情我真的不喜欢飞镖。那么我不应该在不使用同步的情况下做到这一点呢?同步并不好,因为我需要在“main”部分编写所有代码而不调用任何空隙来处理输入。此外,如果我使用同步并通过目录中的文件选择循环并尝试将其添加到列表并打印输出,它将重复打印目录中第一个文件的输出。
所以有什么“技巧”让我的工作如何去做?任何其他脚本语言中的这种海峡前进简单操作在飞镖中不那么直接:(
答案 0 :(得分:1)
dart中的许多API都使用异步操作。通常,此操作返回Future。一旦操作结果可用,就会调用Future.then
给出的函数。
在您的例子中,text.add(lines)
在 for (var l in text) print (l);
之后被称为,因此当您尝试阅读其内容时,text
列表仍为空。为了使代码工作,您必须将print
放入回调函数中。类似的东西:
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);
}