首页 > 解决方案 > 小部件不更新

问题描述

我有一个名为 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() 来更新小部件?

标签: flutterdart

解决方案


getDataasync,所以 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 操作完成后调用。


推荐阅读