【问题标题】:FutureBuilder, SetState: Variable Not Updating When Deleting setStateFutureBuilder、SetState:删除 setState 时变量未更新
【发布时间】:2020-10-30 18:16:15
【问题描述】:

我了解到将 setState(() 和 FutureBuilder 放在一起并不是一个好习惯。当我删除我的 setState(() 时,我注意到 isWaiting 变量不再更新到 MakeCards 类并保持为 True。但是当我离开我的 setState 时,即使它是空的 setState((){ } 然后 isWaiting 正确地更新为 False。我需要帮助来理解为什么会这样以及我该怎么做在删除我的 setState(() 时,将 MakeCards 中的 isWaiting 更新为 False。

    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,
    );
  }
}

【问题讨论】:

    标签: flutter dart setstate flutter-futurebuilder


    【解决方案1】:

    您在使用FutureBuilder 时不需要setState

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

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

    【讨论】:

      猜你喜欢
      • 2021-12-18
      • 2020-09-30
      • 2021-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多