Flutter 如何在后台数据更改时刷新ListView.Builder?

Flutter 如何在后台数据更改时刷新ListView.Builder?,flutter,Flutter,我有一个从API获取数据的ListView,API调用首先从initState()进行,并分配给listdatafromapi=[]。在我再次对同一个API进行后台调用之后,我获取数据并将其分配到中的相同列表dataFromApi setState(() { dataFromApi = []; for (DataFromApi td in resData.data) { dataFromApi.add(td); } }); 记录时,数据会发生变化,但UI不会发生变化。如何更

我有一个从API获取数据的
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()
方法