我正试图通过各种方式更改代码来解决这个问题。但我不明白这里到底出了什么问题。无论我如何更改代码,这个错误都会在最后出现。这表明了我在FutureBuilder中的问题。请试着帮我。
还请检查我的api json。
{
"coord": {
"lon": 90.4167,
"lat": 24.1667
},
"weather": [
{
"id": 500,
"main": "Rain",
"description": "light rain",
"icon": "10d"
}
]
}
代码示例:
Widget updateTempWidget(String city) {
return FutureBuilder(
future: getWheather(util.appID, city),
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.hasData) {
Map content = snapshot.data!;
return Container(
child: Column(
children: [
ListTile(
title: Text(content["weather"]["icon"].toString()),
)
],
),
);
}
if (snapshot.hasError) {
return Text("Error");
}
return CircularProgressIndicator();
});
}
请注意,天气是一个列表,而不是映射,在使用可为null的运算符时要小心,我建议始终将对象从api映射到一个类,检查每个对象并避免使用null变量,尽量使用空列表、空字符串等默认值。
Widget updateTempWidget(String city) {
return FutureBuilder(
future: getWheather(util.appID, city),
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.hasData) {
var content = snapshot.data ?? {};
var _weather = content['weather'];
if(_weather is List){
var _icon =_weather.isNotEmpty ? (_weather[0]['icon'] ?? 'undefined' ): 'list is empty';
return Container(
child: Column(
children: [
ListTile(
title: Text(_icon),
)
],
),
);
}
return Text("Weather is not list");
}
if (snapshot.hasError) {
return Text("Error");
}
return CircularProgressIndicator();
});
}
首先,您应该尝试在检索数据的行附近放置一些打印语句(或者更好地使用调试器(。
if (snapshot.hasData) {
Map content = snapshot.data!;
print(content);
检查您正在获取的对象,并验证来自api的图标是否为空。它还将向您显示数据的结构。您也可以直接尝试登录图标控制台