Dart 如何对api中的数据进行排序?

Dart 如何对api中的数据进行排序?,dart,flutter,json.net,Dart,Flutter,Json.net,有两个下拉按钮,显示国家和运动类型的列表。如果选择了某一项,则需要显示列表,其中列出了国家和/或体育项目所选的联赛,如果未选择任何项目,则显示所有联赛 但我得到: Dart错误:未处理的异常: 在dispose()之后调用setState():_SportLigPageState#b5830(生命周期状态:失效,未装入) 如果您看到小部件树(例如),就会发生这种情况。呼叫时可能会发生此错误。Dispose()回调。必须确保对象仍在树中。 如果不是,这可以是一张存储卡。为了避免内存泄漏,请考虑De

有两个下拉按钮,显示国家和运动类型的列表。如果选择了某一项,则需要显示列表,其中列出了国家和/或体育项目所选的联赛,如果未选择任何项目,则显示所有联赛

但我得到:

Dart错误:未处理的异常: 在dispose()之后调用setState():_SportLigPageState#b5830(生命周期状态:失效,未装入) 如果您看到小部件树(例如),就会发生这种情况。呼叫时可能会发生此错误。Dispose()回调。必须确保对象仍在树中。 如果不是,这可以是一张存储卡。为了避免内存泄漏,请考虑Debug()。 联盟Api::

class-LigList扩展了StatefulWidget{
@凌驾
_LigListState createState()=>\u LigListState();
}
类_LigListState扩展了状态{
弦乐运动;
弦国;
列出数据;
未来的getJsonData()异步{
http.响应;
如果(运动!=null){
if(country!=null)response=wait http
.get(Uri.encodeFull('https://www.thesportsdb.com/api/v1/json/1/all_leagues.php?c=$sport&s=$country'),标题:{“Accept”:“application/json”});
else响应=等待http
.get(Uri.encodeFull('https://www.thesportsdb.com/api/v1/json/1/all_leagues.php?c=$sport'),标题:{“Accept”:“application/json”};}
如果(country==null){response=wait http
.get(Uri.encodeFull('https://www.thesportsdb.com/api/v1/json/1/all_leagues.php“),标题:{“接受”:“应用程序/json”});}
else响应=等待http
.get(Uri.encodeFull('https://www.thesportsdb.com/api/v1/json/1/all_leagues.php?c=$country'),标题:{“Accept”:“application/json”});
var convertDatatoJson=json.decode(response.body);
data=convertDatatoJson['leagues'];
返回“成功”;
}
静态常量菜单项=countriesList;
最终列表_dropDownItems=菜单项
.map((字符串CountruValue)=>
下拉菜单项(
值:CountruValue,
子项:文本(CountruValue),
),
).toList();
@凌驾
小部件构建(构建上下文){
返回容器(
儿童:中心(
子项:列(子项:[
未来建设者(
生成器:(BuildContext上下文,异步快照){
返回下拉按钮(
价值:国家,
提示:文本(“选择要查找的计数联盟”),
项目:_下拉项目,
一旦更改:(值){
国家=价值;
印刷品(国家);
setState((){});
},
);}),
尺寸箱(宽度:5),
未来建设者(
未来:_getSports(),
生成器:(BuildContext上下文,异步快照){
返回snapshot.hasData
?下拉按钮(
价值观:体育,
提示:文本(“选择要查找的运动联盟”),
项目:snapshot.data,
一旦更改:(值){
运动=价值;
印刷(体育);
setState((){});
},
)
:填充(
填充:边缘组。对称(垂直:20),
child:CircularProgressIndicator());
}),
灵活的(
孩子:未来建设者(
future:getJsonData(),
生成器:(BuildContext上下文,异步快照){
返回ListView.separated(
itemCount:data==null?0:data.length,
itemBuilder:(构建上下文,int i){
返回容器(
儿童:中心(
子:列(
crossAxisAlignment:crossAxisAlignment
伸展
儿童:[
列表砖(
标题:文本(数据[i]['strLeague']),
字幕:文本(
数据[i]['strSport']),
onTap:(){
导航器。推(
上下文
新材料路线(
建造商:(
BuildContext)=>
新建ComandListScreen()
//(数据[i])
));
},
),
]
)
)
);
});
}))
]),
),
);
}
}

非常感谢您的帮助。

您的代码有很多问题。代码中的第一个子项包装在FutureBuilder中,但您没有使用任何未来的功能

 FutureBuilder(
   builder: (BuildContext context, AsyncSnapshot snapshot) {
      return DropdownButton(
        value: country,
        hint: Text("Choose a countre league of which you want to find"),
        items:  _dropDownItems,
        onChanged: (value) {
           country = value;
           print(country);
           setState(() {}); // Remove this line
         },
  );}),
除此之外,您还在onChanged回调中随机调用setState(),其中没有任何内容。我建议你把这个小部件从FutureBuilder中拿出来,自己使用下拉按钮

那么在这一行呢,

itemCount: data == null ? 0 : data.length,
您正在使用数据,这些数据是您在将来调用的。您可能想了解如何正确使用FutureBuilder小部件。只需从未来的_getJsonData()返回数据对象,因为它是alwa
itemCount: data == null ? 0 : data.length,