我找到了在构建窗口小部件时如何等待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);
答案 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