Introduced auto refresh for API Data

This commit is contained in:
2026-09-01 14:28:35 +02:00
parent 3ddb9fa066
commit 435698086d
6 changed files with 348 additions and 14 deletions
+24 -3
View File
@@ -2,6 +2,7 @@ import 'package:ac_web/Api/AcApi.dart';
import 'package:ac_web/Api/Dtos/EReportType.dart';
import 'package:ac_web/Api/Dtos/ReportDto.dart';
import 'package:ac_web/Pages/ReportDetails.dart';
import 'package:ac_web/Widgets/AutoRefreshState.dart';
import 'package:ac_web/Widgets/LatestReportEntry.dart';
import 'package:ac_web/Widgets/LatestReportHeader.dart';
import 'package:ac_web/Widgets/ReportTypeIcons.dart';
@@ -20,7 +21,8 @@ class LatestReportColumn extends StatefulWidget{
State<LatestReportColumn> createState() => _LatestReportColumnState();
}
class _LatestReportColumnState extends State<LatestReportColumn>{
class _LatestReportColumnState extends State<LatestReportColumn>
with AutoRefreshState<LatestReportColumn> {
late Future<List<ReportDto>> mReportsFuture;
@@ -30,17 +32,36 @@ class _LatestReportColumnState extends State<LatestReportColumn>{
mReportsFuture = AcApi.instance.reports.getReports();
}
/// Automatic reload. The reports that are already on screen stay visible
/// while the request runs, the future is only replaced once it succeeded.
@override
Future<void> RefreshData() async {
final List<ReportDto> reports = await AcApi.instance.reports.getReports();
if (!mounted) {
return;
}
setState(() {
mReportsFuture = Future<List<ReportDto>>.value(reports);
});
}
@override
Widget build(BuildContext context) {
return FutureBuilder<List<ReportDto>>(
future: mReportsFuture,
builder: (context, snapshot) {
if (snapshot.connectionState != ConnectionState.done) {
// Not `connectionState`: a refresh puts the builder back into the
// waiting state although the previous reports are still available, and
// those should stay on screen instead of flashing a spinner.
if (!snapshot.hasData && !snapshot.hasError) {
return const Center(child: CircularProgressIndicator());
}
if (snapshot.hasError) {
if (snapshot.hasError && !snapshot.hasData) {
return Center(child: Text('Could not load reports: ${snapshot.error}'));
}