Как предотвратить раннее срабатывание Flutter FutureBuilder? - PullRequest
0 голосов
/ 04 мая 2020

Я использую следующий 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.

1 Ответ

1 голос
/ 04 мая 2020

Foreach вашего _userSquadIds создает проблему. Если вы хотите сделать это asyn c, вы можете использовать Future.forEach .

Изменить следующий код.

_userSquadIds.forEach((key, value) async {
      print('itter');
      final result = await _squadsRef.child(key).once();
        _userSquads.add(result.value);
        print(result.value);
        print(_userSquads);
      });

Со следующим.

 await Future.forEach(_userSquadIds, (key,value) async {
     print('itter');
      final result = await _squadsRef.child(key).once();
        _userSquads.add(result.value);
        print(result.value);
        print(_userSquads);
    });
...