首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FutureBuilder,SetState:删除setState时不更新的变量

FutureBuilder,SetState:删除setState时不更新的变量
EN

Stack Overflow用户
提问于 2020-10-30 18:16:15
回答 1查看 49关注 0票数 1

我了解到,将setState(() )和FutureBuilder放在一起并不是很好的实践。当我删除我的setState(() )时,我注意到isWaiting变量不再更新到MakeCards类中,而是停留在True。但是,当我离开我的setState时,即使它是空的setState((){ },isWaiting也会正确地更新为False。我需要帮助理解为什么是这样,以及如何在删除isWaiting (())的同时将MakeCards中的setState更新为False。

代码语言:javascript
复制
    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;
              }

构建方法

代码语言:javascript
复制
                 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 (独立文件)

代码语言:javascript
复制
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,
    );
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-30 19:29:05

您在使用setState时不需要FutureBuilder

您可以将未来构建器移动到小部件树的根(取决于来自该未来的数据的树的部分)。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64613770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档