Я использую следующий 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)
не выполняются до тех пор, пока Состояние соединения в будущем выполнено:
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()
, но я пробовал сто различных способов написать это, и я не могу понять, как убедитесь, что код завершил извлечение данных из базы данных в блоке forEach
до того, как будет установлено Future.