Flutter 如何以正确的方式定义未来列表?
我对flatter和dart有点陌生,我正在尝试使用FutureBuilder来创建一些从firebase获取数据的小部件。实际上对我不起作用的是我的future函数,因为我基本上不返回future。这是我想要使用的函数。这里的friends是访问firebase数据的用户列表。我的问题在于列表试验的定义,它返回为空,没有任何未来。我获取每个成员数据的代码似乎工作得很好,至少添加了数据,然后小部件自行构建,但在此之前,我返回了这个空列表,它在snapshots.hasData上返回一个true。如果有人能帮我,那就太棒了。事实上,在我看来,我有一个未来的清单,但我不太明白如何把它纳入其中Flutter 如何以正确的方式定义未来列表?,flutter,dart,future,Flutter,Dart,Future,我对flatter和dart有点陌生,我正在尝试使用FutureBuilder来创建一些从firebase获取数据的小部件。实际上对我不起作用的是我的future函数,因为我基本上不返回future。这是我想要使用的函数。这里的friends是访问firebase数据的用户列表。我的问题在于列表试验的定义,它返回为空,没有任何未来。我获取每个成员数据的代码似乎工作得很好,至少添加了数据,然后小部件自行构建,但在此之前,我返回了这个空列表,它在snapshots.hasData上返回一个true。
`Future<List<dynamic>> _getData(members) async {
List trial = [];
int _daysUntilBirthday;
friends.map((friend) async => await DatabaseService().getUserInfo(
generalServices().destructureId(friend),
['uid']).then((snapshots) {
trial.add({
'uid': snapshots[0],
});
}))
//.toList()
;
return trial;`
`Future\u getData(成员)异步{
列表试验=[];
国际日至生日;
map((friend)async=>await DatabaseService().getUserInfo(
generalServices().destructureId(friend),
['uid'])。然后((快照){
试用版({
“uid”:快照[0],
});
}))
//托利斯先生()
;
返回审判`
My futureBuilder是在streamBuilder中创建的:
Widget build(BuildContext context) {
return StreamBuilder(
stream: _members,
builder: (context, snapshot) {
if (snapshot.hasData) {
if (snapshot.data['members'] != null) {
if (snapshot.data['members'].length != 0) {
AsyncSnapshot<dynamic> _userData = snapshot;
return FutureBuilder<List>(
future: _getData(_userData.data['members']),
builder: (context, AsyncSnapshot<List> snapshot) {
if (snapshot.hasData) {
if (snapshot.data != null) {
List sortedList = snapshot.data
..sort((a, b) => a['age']
.compareTo(b['age']));
return ListView.builder(
小部件构建(构建上下文){
返回流生成器(
资料流:_成员,
生成器:(上下文,快照){
if(snapshot.hasData){
if(snapshot.data['members']!=null){
if(snapshot.data['members'].length!=0){
AsyncSnapshot\u userData=快照;
回归未来建设者(
未来:_getData(_userData.data['members']),
生成器:(上下文,异步快照){
if(snapshot.hasData){
如果(snapshot.data!=null){
List sortedList=snapshot.data
…排序((a,b)=>a['age']
.与(b[‘年龄’))相比;
返回ListView.builder(
主要问题是,\u getData
没有返回未来(如您所说)。相反,您在.map
实现中处理未来。因此,该函数将在您的请求完成之前返回空数组试用版
相反,将每个getUserInfo
返回的Future
添加到Iterable
中,然后返回Future
,同时等待它们
我试图在不了解上下文的情况下重写函数,因为从您的问题很难判断:
Future\u获取数据(朋友){
final userInfoFutures=friends.map((friend)=>DatabaseService().getUserInfo(
generalServices().destructureId(friend),['uid']);
}));
返回Future.wait(userInfoFutures);
}
旁注:您的示例(未使用的变量和参数)中有很多杂乱无章的地方,我将其删除。步骤1:将代码组织成函数,这样获取数据的代码就不会使UI代码过于复杂。正如@sventropy所说,其中一个问题是_getData函数。看起来您是从使用承诺中来的(基本上是未来),但在Dart中,您有词法作用域,并且async await在其自身的闭包中,因此_getData函数在返回空数组之前不会等待内部then()更新以更新试用版。然后在构建函数运行且UI缺少更新后,它在单独的作用域中更新试用版。“await”在Dart中进一步执行之前,需要在相同的函数作用域中暂停函数调用。