flutter - 后台数据更改时如何刷新 ListView.Builder?
问题描述
我有一个ListView
从 API 获取数据的 API,API 调用首先来自initState()
并分配给List<DataFromApi> dataFromApi = [];
. 在某个时间再次对同一个 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}');
}
),
);
}
}
解决方案
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(() {
});
}
}
}
对其他方法使用类似。这对我有用
推荐阅读
- azure-functions - 在应用服务计划超时上运行的函数
- html - 一个输入字段上的只读和必需
- android - WebView 在小木红米 Note 4 上崩溃
- javascript - 在 Ubuntu 18.04 上安装 nodemon 时出错
- c# - C# 编组、不平衡堆栈和正确获取 PInvoke 签名
- c# - .png 和 .jpg 的 ProcessStartInfo.Verbs 只是“printto”
- xml - 如何使用 jvm-cucumber-parallel-plugin 重新运行失败的测试
- angular - Constructor里面注入装饰器有什么用
- javascript - 如何访问这些对象?
- php - 根据 PhpStorm,为什么这个 PHP if 语句不是最优的