Flutter 如何在后台数据更改时刷新ListView.Builder?
我有一个从API获取数据的Flutter 如何在后台数据更改时刷新ListView.Builder?,flutter,Flutter,我有一个从API获取数据的ListView,API调用首先从initState()进行,并分配给listdatafromapi=[]。在我再次对同一个API进行后台调用之后,我获取数据并将其分配到中的相同列表dataFromApi setState(() { dataFromApi = []; for (DataFromApi td in resData.data) { dataFromApi.add(td); } }); 记录时,数据会发生变化,但UI不会发生变化。如何更
ListView
,API调用首先从initState()
进行,并分配给listdatafromapi=[]代码>。在我再次对同一个API进行后台调用之后,我获取数据并将其分配到中的相同列表dataFromApi
setState(() {
dataFromApi = [];
for (DataFromApi td in resData.data) {
dataFromApi.add(td);
}
});
记录时,数据会发生变化,但UI不会发生变化。如何更新ListView
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
List<DataFromApi> dataFromApi = [];
@override
void initState() {
loadData();
super.initState();
fetchFirstData();
initTimedDataCall();
}
initTimedDataCall() {
Timer.periodic(Duration(minutes: 5), (timer) {
setState(() {
timedCall();
});
});
}
fetchFirstData() async {
final response = await http.get(
Utils.getDataUrl,
);
if (response.statusCode == 200) {
final resData = DataListFromJson(response.body);
if (resData.status == 1) {
print(response.body);
setState(() {
dataFromApi = [];
for (DataFromApi td in resData.data) {
dataFromApi.add(td);
}
});
}
///
///
/// DOING SOME MORE THINGS IN FIRST CALL
///
///
}
}
timedCall() async {
final response = await http.get(
Utils.getDataUrl,
);
if (response.statusCode == 200) {
final resData = DataListFromJson(response.body);
if (resData.status == 1) {
print(response.body);
setState(() {
dataFromApi = [];
for (DataFromApi td in resData.data) {
dataFromApi.add(td);
}
});
}
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: ListView.builder(
itemCount: dataFromApi.length,
itemBuilder: (context, index) {
return Text('${dataFromApi[index].title}');
}
),
);
}
}
类主页扩展StatefulWidget{
@凌驾
_HomePageState createState()=>\u HomePageState();
}
类_HomePageState扩展状态{
列出dataFromApi=[];
@凌驾
void initState(){
loadData();
super.initState();
fetchFirstData();
initTimedDataCall();
}
initTimedDataCall(){
定时(持续时间(分钟:5),(定时){
设置状态(){
timedCall();
});
});
}
fetchFirstData()异步{
最终响应=等待http.get(
Utils.getDataUrl,
);
如果(response.statusCode==200){
final resData=DataListFromJson(response.body);
如果(resData.status==1){
打印(响应.正文);
设置状态(){
dataFromApi=[];
for(resData.data中的DataFromApi td){
dataFromApi.add(td);
}
});
}
///
///
///在第一次通话中做更多的事情
///
///
}
}
timedCall()异步{
最终响应=等待http.get(
Utils.getDataUrl,
);
如果(response.statusCode==200){
final resData=DataListFromJson(response.body);
如果(resData.status==1){
打印(响应.正文);
设置状态(){
dataFromApi=[];
for(resData.data中的DataFromApi td){
dataFromApi.add(td);
}
});
}
}
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:ListView.builder(
itemCount:dataFromApi.length,
itemBuilder:(上下文,索引){
返回文本(“${dataFromApi[index].title}”);
}
),
);
}
}
计算完成后,尝试调用setState
timedCall() async {
final response = await http.get(
Utils.getDataUrl,
);
if (response.statusCode == 200) {
final resData = DataListFromJson(response.body);
if (resData.status == 1) {
print(response.body);
dataFromApi = [];
for (DataFromApi td in resData.data) {
dataFromApi.add(td);
}
setState(() {
});
}
}
}
对其他方法使用类似的方法。这在我这边起作用通常建议只使用setState
方法包装状态的实际更改,而不是任何可能与更改相关的计算。能否从initTimedDataCall
中的setState
中删除timedCall()
方法