Flutter中setstate函数的无限循环

zf9nrax1  于 2023-05-29  发布在  Flutter
关注(0)|答案(1)|浏览(139)

当我在下面的代码中调用有状态小部件中的setstate函数时,我得到了无限循环。
当我删除它时,它会停止循环,但我不会更新我的小部件,所以我需要使用setstate来更新我的小部件,但我找不到一种方法来摆脱它所导致的无限循环。

//On changes in players reference in the RT DB
playersRef.onValue.listen(  
      (DatabaseEvent event) {
        print("Changes in DB");
        List<Player> tempPlayers = [];
        for (final playerSnapshot in event.snapshot.children) {
          //Adding all players info from RT DB into tempPlayers
          tempPlayers.add(Player(
            playerSnapshot.child("name").value.toString(),
            playerSnapshot.child("id").value.toString(),
            (judge == playerSnapshot.child("name").value.toString())
                ? true
                : false,
            playerSnapshot.child("isJudge").value as bool,
            playerSnapshot.child("isLoaded").value as bool,
          ));
        }
        
        //Updating players list with tempPlayers list
        setState(
          () {
            print("In set state");
            players = tempPlayers;
          },
        );
      },
    );

我尝试在playersRef.onValue.listen()中的不同位置删除setstate,但没有一个成功。
我试图用这部分代码来更新我的球员列表,每当真实的数据库中有任何变化时,然后通过使用setstate来更新我的小部件,以反映更新后的球员列表。

7tofc5zh

7tofc5zh1#

就像S. M. JAHANGIR说的,可能想使用StreamBuilder,通过snapshots()函数监听firebase集合ref上的更改会更安全。您还应该需要setState,因为您可以从StreamBuilder构建UI。

StreamBuilder(
 stream: playersRef.snapshots(),
 builder: (context, snapshot) {
  if (snapshot.hasData) {
   return ListView.builder(
    itemBuilder: (context, index) {
     return ListTile();
      },
     );
   }
   return CircularProgressIndicator();
  },
),

相关问题