list - 在 forEach 循环中填充列表之前,我的异步调用正在返回
问题描述
我有一个从设备获取文件名列表的例程,然后读取文件以构建列表。但是,调用例程总是返回零项。我打印文件名,所以我知道它们存在,但是,在我读取文件之前,异步似乎正在返回。我在进行 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();
});
});
}
});
解决方案
这段代码
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 user = User.fromJson(json.decode(contents));
String name = user.NameLast + ", " + user.NameFirst;
print(name);
l.add(name);
}
return l;
}
返回列表l
,然后处理异步forEach(...)
回调
如果您将其更改为
Future<List<String>> readHeaderData() async {
List<String> l = new List();
List<String> files = await readHeaders(); // Gets filenames
for(var filename in files) { /// <<<<==== changed line
final file = await File(filename);
String contents = await file.readAsString();
User user = User.fromJson(json.decode(contents));
String name = user.NameLast + ", " + user.NameFirst;
print(name);
l.add(name);
}
return l;
}
在处理完所有文件名之前,该函数不会返回。
files.forEach((filename) async {
意味着您可以await
在回调内部使用,但forEach
不关心(filename) async {...}
返回什么。
推荐阅读
- python - Pillow 7.2.0 不支持 Python 3.9
- android - 如何制作在 BlueStacks 上运行时需要调整自动请求图形设置的 Android 应用
- c - 如何生成一个随机的 32 位二进制数并使用 C 对其进行操作/从中提取某些位?
- python - 如何用类和对象缩短此代码
- javascript - 如何检查具有选定属性但它们是不同类型的两个对象的相等性
- python - 在python中将列表转换为json文件中的字典
- javascript - 制作两个按钮,使 div 随机放置
- flutter - 如何在不将应用程序置于前台的情况下关闭本地通知
- youtube-data-api - 以我自己的身份以程序方式访问 YouTube?
- python - 我可以将 Selenium/Geckodriver 浏览器重新连接到新的驱动程序吗?