Compare commits

...

2 Commits

Author SHA1 Message Date
5df67920ea Implemented Loading Overlay 2025-01-27 17:10:45 +01:00
4765342ad1 Added Station Filter without function and refactored 2025-01-27 16:27:25 +01:00
6 changed files with 137 additions and 10 deletions

View File

@@ -1,7 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import '../Widgets/reading_graph.dart'; import '../widgets/reading_graph.dart';
import '../model/flood_station.dart'; import '../model/flood_station.dart';
import '../model/reading.dart'; import '../model/reading.dart';
import '../services/api.dart'; import '../services/api.dart';

View File

@@ -1,8 +1,10 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import '../Widgets/flood_station_list_view.dart'; import '../widgets/flood_station_list_view.dart';
import '../services/flood_station_provider.dart'; import '../services/flood_station_provider.dart';
import '../widgets/loading_notifier.dart';
import '../widgets/station_filter.dart';
import 'flood_station_page.dart'; import 'flood_station_page.dart';
class LandingPage extends StatefulWidget { class LandingPage extends StatefulWidget {
@@ -16,25 +18,72 @@ class LandingPage extends StatefulWidget {
class _LandingPageState extends State<LandingPage> { class _LandingPageState extends State<LandingPage> {
late FloodStationProvider floodStationProvider; late FloodStationProvider floodStationProvider;
bool _isLoading = false;
OverlayEntry? _overlayEntry;
@override @override
initState() { initState() {
super.initState(); super.initState();
WidgetsBinding.instance WidgetsBinding.instance.addPostFrameCallback((_) {
.addPostFrameCallback((_) => floodStationProvider.loadAllStations()); _isLoading = true;
showLoadingNotifier(context: context, message: 'Loading');
floodStationProvider
.loadAllStations()
.whenComplete(() => removeLoadingNotifier());
});
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
floodStationProvider = context.watch<FloodStationProvider>(); floodStationProvider = context.watch<FloodStationProvider>();
return Scaffold( return Scaffold(
body: FloodStationListView( body: Column(
children: [
StationFilter(
onEditingComplete: (filterText) {},
),
Expanded(
child: FloodStationListView(
stations: floodStationProvider.allStations, stations: floodStationProvider.allStations,
onItemTapped: (station) { onItemTapped: (station) {
floodStationProvider.selectedStation = station; floodStationProvider.selectedStation = station;
Navigator.of(context).pushNamed(FloodStationPage.routeName); Navigator.of(context).pushNamed(FloodStationPage.routeName);
}, },
), ),
),
],
),
); );
} }
Future<void> showLoadingNotifier({
required BuildContext context,
required String message,
}) async {
OverlayState? overlayState = Overlay.of(context);
_overlayEntry = OverlayEntry(
builder: (c) {
return Positioned(
bottom: 16,
left: 0,
right: 0,
child: Center(
child: LoadingNotifier(
message: 'Loading',
onDismissed: () => removeLoadingNotifier(),
),
),
);
},
);
overlayState.insert(_overlayEntry!);
overlayState.setState(() {});
}
void removeLoadingNotifier() {
if (_overlayEntry != null) {
_overlayEntry?.remove();
_overlayEntry = null;
}
}
} }

View File

@@ -0,0 +1,42 @@
import 'package:flutter/material.dart';
class LoadingNotifier extends StatelessWidget {
const LoadingNotifier(
{super.key, required this.onDismissed, required this.message});
final void Function() onDismissed;
final String message;
@override
Widget build(BuildContext context) {
return Card(
color: Theme.of(context).colorScheme.primaryContainer,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(45)),
child: SizedBox(
width: 500,
height: 60,
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 20),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
mainAxisSize: MainAxisSize.max,
children: [
SizedBox(
width: 25,
height: 25,
child: CircularProgressIndicator(),
),
Text(
message,
style: Theme.of(context).textTheme.titleSmall,
),
IconButton(
onPressed: () => onDismissed(),
icon: Icon(Icons.close),
)
],
),
),
),
);
}
}

View File

@@ -0,0 +1,36 @@
import 'package:flutter/material.dart';
class StationFilter extends StatefulWidget {
const StationFilter({super.key, required this.onEditingComplete});
final void Function(String filterText) onEditingComplete;
@override
State<StationFilter> createState() => StationFilterState();
}
class StationFilterState extends State<StationFilter> {
TextEditingController filterController = TextEditingController();
@override
Widget build(BuildContext context) {
return TextField(
controller: filterController,
decoration: InputDecoration(
prefixIcon: Icon(Icons.search),
suffixIcon: Opacity(
opacity: filterController.text.isEmpty ? 0 : 1,
child: IconButton(
onPressed: () {
filterController.clear();
setState(() {});
},
icon: Icon(Icons.delete),
),
),
label: Text('Filter'),
),
onChanged: (_) => setState(() {}),
onEditingComplete: () => widget.onEditingComplete(filterController.text),
);
}
}