首页 > 解决方案 > 异步未来,如何将已获取单个项目的事件发送回调用者?

问题描述

我正在制作一个位于单独类中的 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;
}

我应该如何解决这个问题?

标签: dartflutter

解决方案


似乎没有特别优雅的方法可以做到这一点。从一些颤动的代码示例中,似乎使用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为任何函数类型。


推荐阅读