【发布时间】:2020-05-04 00:23:29
【问题描述】:
我正在使用以下 FutureBuilder 来处理从 Firebase 数据库中获取“小队”信息,但 Future 说它在我可以处理数据库中的所有数据之前完成:
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: _getUserSquads(),
builder: (ctx, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return Center(
child: CircularProgressIndicator(),
);
} else {
if (_userSquads == null) {...} else {
print(snapshot.connectionState);
return Text(_userSquads.length.toString());
}
}
},
);
...以下两个功能是我在FutureBuilder完成前需要完成的功能:
Future<void> _getUserSquads() async {
print('1');
final squadIdsResult = await _userSquadsRef.once();
print('2');
if (squadIdsResult.value == null) {
print('3');
return;
}
print('4');
_userSquadIds = squadIdsResult.value;
print('5');
final test = await _test();
print('6');
}
Future<void> _test() {
print('7');
_userSquadIds.forEach((key, value) async {
print('itter');
final result = await _squadsRef.child(key).once();
_userSquads.add(result.value);
print(result.value);
print(_userSquads);
});
print('8');
print('9');
}
print(result.value) 和 print(_useraSquads) 这两个打印语句直到 Future 的连接状态完成后才会执行:
I/flutter (29217): 2
I/flutter (29217): 4
I/flutter (29217): 5
I/flutter (29217): 7
I/flutter (29217): itter
I/flutter (29217): 8
I/flutter (29217): 9
I/flutter (29217): 6
I/flutter (29217): ConnectionState.done
I/flutter (29217): {squadName: SAFTS}
I/flutter (29217): [{squadName: SAFTS}]
似乎问题出在_test() 函数中,但我已经尝试了一百种不同的方法来编写它,但我不知道如何确保代码完成从在 Future 设置为 done 之前,forEach 块中的数据库。
【问题讨论】:
标签: flutter asynchronous dart async-await