RangeError (index): Invalid value: Valid value range is empty using async 函数

RangeError (index): Invalid value: Valid value range is empty using async function

我正在尝试遍历 List<ClassName> 以便稍后从中检索数据。 数据是从 Future<List<ClassName>> _getValues() async 函数内的 json 文件中检索的。 问题是,当我启动应用程序时,我收到“RangeError (index): Invalid value: Valid value range is empty: -1”,但几分钟后屏幕显示正确的信息。 我是 Flutter 的新手,但据我了解,迭代首先是通过一个空列表发生的。 这是我提到的功能:

  Future<List<CountryData>> _getValues() async {
var countriesData = List<CountryData>();
var data = await http
    .get("https://opendata.ecdc.europa.eu/covid19/casedistribution/json");

var jsonData = json.decode(data.body);

for (var i in jsonData["records"].toList()) {
  countriesData.add(CountryData.fromJson(i));
}

return countriesData;

}

这是我设置列表状态的地方:

List<CountryData> _countriesData = List<CountryData>();
void initState() {
_getValues().then((value) {
  setState(() {
    _countriesData.addAll(value);
  });
});
super.initState();

}

这是我从上述列表中获取数据的地方:

int findState(String code) {
var index = _countriesData.length;
for (int i = 0; i < index; i++) {
  if (_countriesData[i].alpha3Code == (code)) {
    return i;
  }
}
return -1;

}

这是我要展示的地方:

Widget build(BuildContext context) {
return Scaffold(
...
...
body: ListView(children: <Widget>[
      Text(_countriesData[findState(code)]])))

国家数据 class 是:

class CountryData{
String alpha3Code;
String day;
String month;
String year;
CountryData(this.alpha3Code, this.day, this.month,this.year);
CountryData.fromJson(Map<String, dynamic> json){
      this.day = json['day'];
      this.month = json['month'];
      this.year = json['year'];
      this.alpha3Code = json['alpha3Code'];
      }
 }

如果您需要更多信息,请联系我。谢谢

你的问题是构建方法运行在你有你想要显示的数据之前。处理此问题的一种方法是使用 'isLoading' 标志,您在 http 调用之前设置为 true,并在 returns 数据时设置为 false(并调用 setState)。在构建方法中,您检查标志并在标志为真时显示进度指示器。当它变为 false 时,您将显示您的 ListView。