import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../widgets/flood_station_list_view.dart'; import '../services/flood_station_provider.dart'; import '../widgets/loading_notifier.dart'; import '../widgets/station_filter.dart'; import 'flood_station_page.dart'; class LandingPage extends StatefulWidget { const LandingPage({super.key}); @override State createState() => _LandingPageState(); } class _LandingPageState extends State { late FloodStationProvider floodStationProvider; OverlayEntry? _overlayEntry; int loadingTimes = 0; @override Widget build(BuildContext context) { floodStationProvider = context.watch(); return Column( children: [ StationFilter( onChanged: (filterText) { if (filterText.isEmpty) { floodStationProvider.filtered = false; setState(() {}); return; } showLoadingNotifier(context: context, message: 'Loading'); floodStationProvider.loadFilteredStations(filterText); floodStationProvider.filteredStationsFuture ?.then((_) => removeLoadingNotifier()); floodStationProvider.filtered = true; }, ), _shouldShowList() ? Expanded( child: FloodStationListView( stations: floodStationProvider.filtered ? floodStationProvider.filteredStations : floodStationProvider.allStations, onItemTapped: (station) { floodStationProvider.selectedStation = station; Navigator.of(context).pushNamed(FloodStationPage.routeName); }, ), ) : Expanded( child: Center( child: ElevatedButton( onPressed: () { showLoadingNotifier(context: context, message: 'Loading'); floodStationProvider .loadAllStations() .whenComplete(() => removeLoadingNotifier()); }, child: Text('Load all Stations'), ), ), ), ], ); } bool _shouldShowList() { if (!floodStationProvider.filtered && floodStationProvider.allStations.isNotEmpty) { return true; } if (floodStationProvider.filtered) { return true; } return false; } Future showLoadingNotifier({ required BuildContext context, required String message, }) async { if (_overlayEntry != null) return; OverlayState? overlayState = Overlay.of(context); _overlayEntry = OverlayEntry( builder: (c) { return Positioned( bottom: 16, left: 0, right: 0, child: Center( child: LoadingNotifier( message: 'Loading', onDismissed: () { floodStationProvider.cancelFilterLoading(); removeLoadingNotifier(); }, ), ), ); }, ); overlayState.insert(_overlayEntry!); overlayState.setState(() {}); } void removeLoadingNotifier() { if (_overlayEntry != null) { _overlayEntry?.remove(); _overlayEntry = null; } } }