【问题标题】:How do I prevent Flutter FutureBuilder from firing early?如何防止 Flutter FutureBuilder 提前触发?
【发布时间】: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


    【解决方案1】:

    您的 _userSquadIds 的 foreach 正在制造问题。如果你想让它异步,你可以使用 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);
        });
    

    【讨论】:

    • 你是我的英雄!
    • 我不得不做一个小改动,因为它在尝试同时处理键和值时遇到问题,但我只是将 _userSquadIds 更改为一个列表,因此我只需要处理一个值和它是固定的。我无法按下接受按钮,谢谢
    猜你喜欢
    • 2021-03-02
    • 2017-02-08
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 2020-05-25
    相关资源
    最近更新 更多