Introduced auto refresh for API Data
This commit is contained in:
@@ -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}'));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user