FutureBuilder、SetState:删除 setState 时变量不更新

FutureBuilder, SetState: Variable Not Updating When Deleting setState

我了解到将 setState(() 和 FutureBuilder 放在一起不是好的做法。当我删除 setState(() 时,我注意到 isWaiting 变量 no更长时间更新到 MakeCards class 并保持在 True。但是当我离开我的 setState 时,即使它是空的 setState((){ } 然后 isWaiting 正确更新为 False 因为它应该。我需要帮助来理解为什么会这样,以及如何在删除我的 setState(().

    bool isWaiting = true; <------------------------------------------
        
            Future<Map> getData() async {
                try {
                  List<String> coinData = await CoinData();
                  Map<String, List<String>> graphData = await GraphData()
                  
                  setState(() { <------------------------------------
                    coinValues = coinData;
                    graphValues = graphData;
                  });

                   isWaiting = false; <----------------------------------
            .
            . (some code)
            .
                return allDataValues;
              }
    

构建方法

                 MakeCards(
                    isWaiting: isWaiting, <-----------------------------
                    selectedCurrency: selectedCurrency,
                    coinData: allDataValues['lastCoinPrices'])
                .makeCards(),
    
                 FutureBuilder<Map>(
                      future: futureData,
                      builder: (context, snapshot) {
                        print("FutureBuilder started");
                        if (!snapshot.hasData)
                          return CircularProgressIndicator();
                        else if (snapshot.data.isEmpty)
                          return Container();
                        else {
                          print("FutureBuilder completed");
                          return Graph(snapshot.data);
                        }
                      })

MakeCards(单独文件)

class MakeCards {
  MakeCards({this.isWaiting, this.selectedCurrency, this.coinData});

  bool isWaiting;
  String selectedCurrency;
  List<String> coinData = [];

  Row makeCards() {
    List<CryptoCard> cryptoCards = [];
    for (int i = 0; i < cryptoAbbreviation.length; i++) {
      cryptoCards.add(
        CryptoCard(
          cryptoCurrency: cryptoAbbreviation[i],
          selectedCurrency: selectedCurrency,
          value: isWaiting ? '---' : coinData[i], <-------------------------
          name: cryptoName[i],
          // iconContent: iconContent,
        ),
      );
    }

    return Row(
      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
      children: cryptoCards,
    );
  }
}

您在使用 FutureBuilder 时不需要 setState

您可以将 Future 构建器移动到小部件树的根部(树中依赖于来自该未来的数据的部分)

然后用快照的状态替换通过变量isWaiting传递的值。