我想从API加载ListView
上的数据,只在按钮单击事件上加载,而不在initState()
中。我从服务器获取数据,但没有在ListView上更新。
我找过这个,但没有找到合适的解决方案,我是个新手。
这是我的代码:
@override
Widget build(BuildContext context) {
List<dynamic> ListData = [];
Future _getData() async {
String apiUrl = "http://myURL";
final params = {"id": "1", "keyword": "xyz"};
var response = await http.post(
Uri.parse(apiUrl),
body: params,
);
var jsonData = jsonDecode(response.body);
List<dynamic> DATA = [];
DATA = jsonData['data'];
setState(() {
ListData = DATA;
});
print('DATA COUNT: ${ListData.length}');
return ListData;
}
}
我要到这里了"数据计数";正确地,检查以下button
&ListView
代码。
SizedBox(
height: 45,
width: 60,
child: ElevatedButton(
style: ElevatedButton.styleFrom(
primary: Colors.orangeAccent,
),
onPressed: () async {
await _getData();
print('button pressed ${ListData.length}');
},
child: Text(
'${ListData.length}',
style: TextStyle(
fontSize: 18.0,
fontWeight: FontWeight.bold,
),
),
),
),
Expanded(
child: ListView.builder(
itemCount: ListData.length,
itemBuilder: (context, index) {
return ListTile(
title: Text('${ListData[index]}'),
);
},
),
),
我在这里获取数据";按钮被按下";同样正确,但没有在button text
和ListView builder
上更新,我的代码有什么问题,请提前感谢。
从构建方法中移除ListData。原因是每次重建方法时调用setState,因此每次都会使ListData为空。
List<dynamic> ListData = [];
`@override
Widget build(BuildContext context) {
Future _getData() async {
String apiUrl = "http://myURL";
final params = {"id": "1", "keyword": "xyz"};
var response = await http.post(
Uri.parse(apiUrl),
body: params,
);
var jsonData = jsonDecode(response.body);
List<dynamic> DATA = [];
DATA = jsonData['data'];
setState(() {
ListData = DATA;
});
print('DATA COUNT: ${ListData.length}');
return ListData;
}
}`
您在构建Methode时分配ListData=[]。当您的构建方法被setState((调用时,ListData将再次分配给[]。
尝试通过您的构建方法分配ListData=[]