我有一个例程,它从设备中获取一个文件名列表,然后读取文件以构建一个列表。但是,调用例程总是返回零项。我打印文件名,所以我知道它们存在,然而,在我读取文件之前,异步似乎正在返回。我在进行HTTP调用时使用了类似的代码。但是,这里的某些东西导致例程返回列表,即使它还没有完成。也许,我打电话的时机不对?我在这里调用retrieveItems:
@override
void initState() {
super.initState();
retrieveItems();
}
字符串
最终我会有一个刷新按钮,但现在我只想让列表填充文件中的数据。
卡利
Future<List<String>> readHeaderData() async {
List<String> l = new List();
List<String> files = await readHeaders(); // Gets filenames
files.forEach((filename) async {
final file = await File(filename);
String contents = await file.readAsString();
User usr = User.fromJson(json.decode(contents));
String name = usr.NameLast + ", " + usr.NameFirst;
print(name);
l.add(name);
}
return l;
型
来电者
void retrieveItems() async {
LocalStorage storage = new LocalStorage();
await storage.readHeaderData().then((item) {
try {
if ((item != null ) &&(item.length >= 1)) {
setState(() {
users.clear();
_users.addAll(item);
});
} else {
setState(() {
_users.clear();
final snackbar = new SnackBar(
content: new Text('No users found.'),
);
scaffoldKey.currentState.showSnackBar(snackbar);
});
}
} on FileNotFoundException catch (e) {
print(e.toString()); //For debug only
setState(() {
_users.clear();
});
});
}
});
型
6条答案
按热度按时间nwlqm0z11#
这个代码
字符串
返回列表
l
,然后处理asycforEach(...)
回调如果你把它改成
型
在处理完所有文件名之前,函数不会返回。
型
这意味着你可以在回调中使用
await
,但forEach
不关心(filename) async {...}
返回什么。rhfm7lfc2#
也有可能
字符串
tuwxkamq3#
为了扩展Günter关于使用
list.map(f)
的评论,这里有一个转换forEach
调用以使其正常工作的示例。破例
错误地假设
forEach
将等待期货:字符串
更正示例
等待异步函数完成,使用
Future.wait
和.map()
:型
2eafrhcq4#
我遇到了类似的问题。问题是, dart 不会等待“每一个”相反,公众相信。有两种解决方案:
字符串
rsl1atfo5#
另一个选择
字符串
qcbq4gxm6#
Future.forEach()将按顺序执行future。迭代等待直到future完成,然后继续下一个元素。
Future.wait()将并行执行futures。返回一个future,它将在所有提供的future完成后完成。
参见Future class