簡體   English   中英

如何防止 Flutter FutureBuilder 提前觸發?

[英]How do I prevent Flutter FutureBuilder from firing early?

我正在使用以下 FutureBuilder 來處理從 Firebase 數據庫中獲取“小隊”信息,但未來說它在我可以處理數據庫中的所有數據之前完成:

@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 的連接 state 完成后才會執行:

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 _test() function 中,但我嘗試了一百種不同的方法來編寫它,但我不知道如何確保代碼完成從數據庫中的數據獲取在 Future 設置為 done 之前的forEach塊。

您的 _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);
    });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM