flutter 当future返回不同的值类型时,future builder中的Future.wait是否可能?

ncgqoxb0  于 2023-03-24  发布在  Flutter
关注(0)|答案(2)|浏览(194)

我已经找到了如何在构建小部件时等待2个不同的未来的答案,但这些都是相同类型的。
但是如果firstFuture()secondFuture()返回不同的值类型--例如int和String(或者像我的用例中那样返回不同的类),也有可能吗?AsyncSnapshot<List<bool>> snapshot中的bool对我来说是一个挑战...

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

5rgfhyps1#

你可以使用Object作为这两个方法的最小公共返回值:

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

但是您必须将结果List<Object>的条目转换回您认为应该是的内容。
就我个人而言,我更喜欢你已经发现的方法,只返回最小的future,一个Future<void>,并将其写入方法内部的相应变量。这也不是完美的,但它保持了类型安全。

41zrol4v

41zrol4v2#

下面的答案可能会帮助你
在包内使用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.

相关问题