dart - 异步未来,如何将已获取单个项目的事件发送回调用者?
问题描述
我正在制作一个位于单独类中的 Future 方法,该方法获取一堆 XKCD 漫画,并将它们放入 List 并返回它。
这一切都很好,花花公子,但是我想在获取单个漫画时通知回来,这样我就可以显示一个进度对话框,说明我们走了多远。
这是我的代码:
// This is inside my class ComicManager
Future<List<ComicModel>> generateComicList() async {
List<ComicModel> comicList = new List<ComicModel>();
ComicModel latestComic = await getLatestComic();
for (var i = 1; i <= latestComic.num; i++) {
try {
http.Response response =
await http.get('https://xkcd.com/${i}/info.0.json');
Map comicmap = json.decode(response.body);
var comic = new ComicModel.fromJson(comicmap);
comicList.add(comic);
print(comic.num);
// Notify here that we have fetched a comic
} catch (ex) {
// Comic could apparently not be parsed, skip it.
}
}
return comicList;
}
我应该如何解决这个问题?
解决方案
似乎没有特别优雅的方法可以做到这一点。从一些颤动的代码示例中,似乎使用VoidCallBack
侦听器是一种公认的方式。
首先在 a 中注册回调函数Set
Set<VoidCallBack> listeners
然后定义你需要的回调函数。并将它们添加到集合中
void fun()
//...
listeners.add(fun);//Or you can define a method to do this or simply pass the function through the constructor of this class.
最后,编写一个notifyListeners
函数或其等价物,并在任何你想要的地方调用它
void notifyListeners(){
for(final listener in listeners){
listener();
}
}
如果您希望回调函数带有参数,只需将 更改VoidCallBack
为任何函数类型。
推荐阅读
- python - Pyspark使用json对象读取json,其中包含json列表,在转换为数据帧时会更改一些格式
- asp.net-mvc - 将远程属性添加到 asp.net 核心时出错
- python - python中的简单线程不会同时运行
- c# - 检查带有数组的宾果程序上的行
- aws-amplify-cli - AWS Amplify Storage 无法在所有 AWS Cognito 用户上按预期工作
- azure - Service Fabric 架构 - 所有流量的入口网关?
- kubernetes - Kubernetes:无法访问 Google Cloud Platform 上的 Kubernetes 仪表板
- flutter - 导航到另一个屏幕没有底部导航栏图标颤动但将底部导航栏保留在另一个屏幕中
- php - 带有内部连接 SQL 语句的预准备语句中的 SQL
- sql-server - 如何查询内部联接查询的结果?