方法 '[]' 在 null 上调用。接收方:空 已尝试调用:[]( "icon" )



我正试图通过各种方式更改代码来解决这个问题。但我不明白这里到底出了什么问题。无论我如何更改代码,这个错误都会在最后出现。这表明了我在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的图标是否为空。它还将向您显示数据的结构。您也可以直接尝试登录图标控制台

相关内容

  • 没有找到相关文章

最新更新