当期货返回不同的价值类型时,Future.wait在未来的构建器中可能出现?

时间:2020-09-14 09:20:50

标签: flutter future

我找到了在构建窗口小部件时如何等待2个不同未来的答案,但是它们的类型相同。 Example from here:

但是如果firstFuture()secondFuture()返回不同的值类型(例如int和String(或与我的用例不同的类)),是否还有可能? bool中的AsyncSnapshot<List<bool>> snapshot对我来说是一个挑战...

FutureBuilder(
    future: Future.wait([
         firstFuture(), // Future<bool> firstFuture() async {...}
         secondFuture(),// Future<bool> secondFuture() async {...}
         //... More futures
    ]),
    builder: (
       context, 
       // List of booleans(results of all futures above)
       AsyncSnapshot<List<bool>> snapshot, 
    ){

       // Check hasData once for all futures.
       if (!snapshot.hasData) { 
          return CircularProgressIndicator();
       }

       // Access first Future's data:
       // snapshot.data[0]

       // Access second Future's data:
       // snapshot.data[1]

       return Container();

    }
);

我还发现了另一个answer,它具有不同的类型,但这是功能而不是类

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);

2 个答案:

答案 0 :(得分:1)

好吧,您始终可以将Object用作这两种方法的最低共同返回值:

Future.wait<Object>([firstFuture(), secondFuture()])

但是您将不得不将结果List<Object>的条目转换回您认为应该的样子。不是很完美,但是可以。

个人而言,我喜欢您已经发现更多的方法,只返回最小的未来,Future<void>,并将其写入方法中的各个变量。那也不是完美的,但是它保持了类型安全。

答案 1 :(得分:1)

下面的答案可能会对您有所帮助

在包装内使用FutureGroup

dependencies: async: ^2.4.1

代码:

void main()  {
  Future<String> future1 = getData(2);
  Future<String> future2 = getData(4);
  Future<String> future3 = getData(6);
  FutureGroup futureGroup = FutureGroup();
  futureGroup.add(future1);
  futureGroup.add(future2);
  futureGroup.add(future3);
  futureGroup.close();
  futureGroup.future.then((value) => {print(value)});
}

Future<String> getData(int duration) async {
  await Future.delayed(Duration(seconds: duration)); //Mock delay
  return "This a test data";
}

输出:

I/flutter ( 5866): [This a test data, This a test data, This a test data] // Called after 6 seconds.

更多参考:

https://medium.com/flutterworld/flutter-futuregroup-d79b0414eaa7