我正在使用Ffltter从服务器下载3个不同的数据集,然后对所有3个数据集执行一些操作.我可以这样做:

List<Foo> foos = await downloader.getFoos();
List<Bar> bars = await downloader.getBars();
List<FooBars> foobars = await downloader.getFooBars();

processData(foos, bars, foobars);

但我更喜欢下载all 3 data sets asynchronously in parallel.我见过Dart有Future.wait method个:

Future<List<T>> wait <T>(
   Iterable<Future<T>> futures, {
   bool eagerError: false, 
   void cleanUp(
      T successValue
   )
}) 

但是,这看起来只会返回相同类型(T)的值.我有3个不同的类型,所以我不知道如何使用它来取回我的3个数据集.

实现这一目标的最佳替代方式是什么?

谢谢

推荐答案

你需要把你的每一个Future<T>调整到一个共同的Future类型.您可以使用Future<void>:

List<Foo> foos;
List<Bar> bars;
List<FooBars> foobars;

await Future.wait<void>([
  downloader.getFoos().then((result) => foos = result),
  downloader.getBars().then((result) => bars = result),
  downloader.getFooBars().then((result) => foobars = result),
]);

processData(foos, bars, foobars);

或者,如果您更喜欢await而不是.then(),Future.wait呼叫可以是:

await Future.wait<void>([
  (() async => foos = await downloader.getFoos())(),
  (() async => bars = await downloader.getBars())(),
  (() async => foobars = await downloader.getFooBars())(),
]);

Flutter相关问答推荐

为什么他们实例化类,然后丢弃该实例?

build_runner显示错误没有为类ClassDeclaration定义getter宏关键字'

下拉图标未居中

如何知道当前屏幕是否处于抖动状态?

'Flutter的无效常数值错误

在LinkedIn上分享Fighter和Web的链接会产生不同的结果

Flutter 渲染HTML和数学(LaTeX和Katex)

带按钮的 Riverpod future Provider

没有为类型 'Widget' 定义运算符 '[]' .try 定义运算符[]

在 Flutter 中显示有关提供者通知的对话框

小部件堆栈未显示顶层

如何停止折线图的抖动

为什么 appBar 小部件在 flutter 中不是常量

如何使用 Rrect 或类似工具在 flutter 中绘制梯形线?

Flutter snapShot.hasData 为假但响应有数据

有什么方法可以将 ChangeNotifier 与 ValueListenableBuilder 一起使用

在 Flutter 中将提取的 Listview.builder 与两个列表一起使用

Flutter :RangeError(索引):无效值:不在包含范围内0..3:4使用IndexedListView.builder

Flutter Web Responsiveness 效率不高

如何在Flutter 中水平滚动堆叠定位的小部件?