我正在为我的应用程序使用 Flutter。我需要从 Firebase 实时数据库中查询大量信息(例如 50 个不同的数据位置),因此我需要异步启动它们并等待它们全部返回,然后再更新 UI 以向用户显示信息。
我如何在 Flutter 中实现这一点?使用异步,等待,我只能等待 1 个异步函数。
请查看Future.wait方法。使用 Future.wait() 您可以启动多个请求,然后等待所有请求完成。我还在下面给出了示例代码。
等待方法
Future<List<T>> wait <T>( Iterable<Future<T>> futures, {bool eagerError: false, void cleanUp( T successValue )} )
等待多个期货完成并收集其结果。
返回一个期货,一旦所有提供的期货都完成,它就会完成,无论是结果还是错误,如果任何提供的期货失败。
返回的 future 的值将是按照迭代期货提供期货的顺序生成的所有值的列表。
如果任何未来以错误结束,则返回的未来以该错误结束。如果进一步的期货也完成了错误,则丢弃这些错误。
如果eagerError 为true,则返回的future 会在其中一个future 中的第一个错误处立即完成并出现错误。否则所有的期货必须在返回的期货完成之前完成(仍然有第一个错误;其余的错误被静默删除)。
在出现错误的情况下,cleanUp(如果提供)将在成功期货的任何非空结果上调用。这使得清理否则会丢失的资源成为可能(因为返回的未来不提供对这些值的访问)。如果没有错误,则不会使用 cleanUp 函数。
对 cleanUp 的调用不应抛出。如果是,则错误将是未捕获的异步错误。
请参见下面的示例代码,所有三个期货的结果同时加载到 ListView 中,因为 Future.wait 在返回结果之前等待所有期货完成:
import 'package:flutter/material.dart';
void main(List<String> args) {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
Future<List<String>> futureWait() async {
return Future.wait([
Future.delayed(const Duration(seconds: 1), () => "First Future Done"),
Future.delayed(const Duration(seconds: 2), () => "Second Future Done"),
Future.delayed(const Duration(seconds: 3), () => "Third Future Done"),
]);
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text("Flutter Demo App"),
),
body: FutureBuilder<List<String>>(
future: futureWait(),
builder: (context, snapshot) {
if (snapshot.hasData) {
print(snapshot.data.length);
return ListView.builder(
itemCount: snapshot.data.length,
itemBuilder: (context, index) => ListTile(
title: Text(snapshot.data[index]),
),
);
}
return const Center(child: CircularProgressIndicator());
},
),
),
);
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句