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
传递的值。
我了解到将 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
传递的值。