FutureBuilder,SetState:删除SetState时变量未更新



我了解到,将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,
);
}
}

使用FutureBuilder时不需要setState

您可以将Future生成器移动到窗口小部件树的根(树中依赖于该未来数据的部分(

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

最新更新