flutter - 小部件不更新
问题描述
我有一个名为 getData 的有状态小部件的方法
void getData() async{
var bitCoinPrice1 = (await coinData.getPriceData('BTC$selectedCurrency')).toStringAsFixed(2);
bitCoinPrice = bitCoinPrice1;
}
我在下拉更改事件中调用此方法
onChanged: (String newValue) {
setState(
() {
selectedCurrency = newValue;
print("Selected currency changed to $selectedCurrency");
getData();
},
);
}
除非我将 getData 中的内容包含在另一个 setState() 中,否则 bitcoinPrice 的值不会反映在小部件中。我的问题是:如果对 getData() 的调用已经在 setState() 内部,为什么需要在 getData() 内部调用另一个 setState() 来更新小部件?
解决方案
getData
是async
,所以 for 主体的执行立即终止,在结果传递setState
之前更新状态。async
由于setState
不允许async
身体,因此您必须以不同的方式做事。
鉴于您提供的代码,您可以执行以下操作:
onChanged: (String newValue) {
selectedCurrency = newValue;
print("Selected currency changed to $selectedCurrency");
getData();
}
并像这样更新getData
代码:
void getData() async{
var bitCoinPrice1 = (await coinData.getPriceData('BTC$selectedCurrency')).toStringAsFixed(2);
setState({
bitCoinPrice = bitCoinPrice1;
});
}
这样,setState
将在await
-ed 操作完成后调用。
推荐阅读
- xamarin - Xamarin 标头不会到达终点
- python - Azure DataBricks:如何对具有一对多关系的两个数据帧进行内部连接,并从两个数据帧中选择特定的列。?
- c++ - 如何解决“预期的声明”?
- apache-kafka - Kafka KSQL Re partition and rekey问题
- haskell - 任意多个不同类型列表的笛卡尔积
- iteration - 使用条件标签遍历 ID 组的语法
- c++ - 使用 MQTT 发送大消息会导致消息丢失
- javascript - Javascript Snake 运动和增长
- azure-cognitive-search - Azure 搜索:将 blob metadata_storage_path 用作键时,是否进行了两次 base64 编码?
- php - 无法打开流:HTTP 请求失败!HTTP/1.1 401 未经授权