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。
我正在尝试遍历 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。