From dfb9b5956003992704fe122ee62c44716f9e2919 Mon Sep 17 00:00:00 2001 From: marco Date: Fri, 24 Jan 2025 23:47:46 +0100 Subject: [PATCH] simple detail view of flood station and readings --- lib/Widgets/flood_station_list_view.dart | 4 +++ lib/model/reading.dart | 11 ++++++++ lib/pages/flood_station_page.dart | 36 ++++++++++++++++++++++++ lib/services/api.dart | 17 +++++++++++ 4 files changed, 68 insertions(+) create mode 100644 lib/model/reading.dart create mode 100644 lib/pages/flood_station_page.dart diff --git a/lib/Widgets/flood_station_list_view.dart b/lib/Widgets/flood_station_list_view.dart index fd8d407..6adec64 100644 --- a/lib/Widgets/flood_station_list_view.dart +++ b/lib/Widgets/flood_station_list_view.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import '../model/flood_station.dart'; +import '../pages/flood_station_page.dart'; class FloodStationListView extends StatelessWidget { const FloodStationListView({super.key, required List stations}) @@ -14,6 +15,9 @@ class FloodStationListView extends StatelessWidget { itemBuilder: (context, index) { final item = _stations.elementAt(index); return ListTile( + onTap: () => Navigator.of(context).push(MaterialPageRoute( + builder: (context) => FloodStationPage(floodStation: item), + )), title: Text(item.label), subtitle: Text(item.town), ); diff --git a/lib/model/reading.dart b/lib/model/reading.dart new file mode 100644 index 0000000..74b2cad --- /dev/null +++ b/lib/model/reading.dart @@ -0,0 +1,11 @@ +class Reading { + final DateTime dateTime; + final double value; + + factory Reading.fromMap(Map json) => Reading( + dateTime: DateTime.parse(json['dateTime']), + value: json['value'], + ); + + Reading({required this.dateTime, required this.value}); +} diff --git a/lib/pages/flood_station_page.dart b/lib/pages/flood_station_page.dart new file mode 100644 index 0000000..57ed9aa --- /dev/null +++ b/lib/pages/flood_station_page.dart @@ -0,0 +1,36 @@ +import 'package:flutter/material.dart'; + +import '../model/flood_station.dart'; +import '../model/reading.dart'; +import '../services/api.dart'; + +class FloodStationPage extends StatelessWidget { + const FloodStationPage({super.key, required FloodStation floodStation}) + : _floodStation = floodStation; + final FloodStation _floodStation; + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text(_floodStation.label), + ), + body: FutureBuilder>( + future: Api.fetchReadingsFromStation(_floodStation.id), + builder: (context, snapshot) { + if (snapshot.hasData) { + return ListView.builder( + itemBuilder: (context, index) { + return ListTile( + title: + Text(snapshot.data!.elementAt(index).value.toString()), + ); + }, + itemCount: snapshot.data!.length, + ); + } else { + return Placeholder(); + } + }), + ); + } +} diff --git a/lib/services/api.dart b/lib/services/api.dart index 2d5776b..bab7bf9 100644 --- a/lib/services/api.dart +++ b/lib/services/api.dart @@ -2,6 +2,7 @@ import 'package:http/http.dart' as http; import 'dart:convert'; import '../model/flood_station.dart'; +import '../model/reading.dart'; class Api { static const String _rootUrl = @@ -18,4 +19,20 @@ class Api { } return stations; } + + static Future> fetchReadingsFromStation( + String stationId) async { + List readings = []; + final dateTime = DateTime.now().subtract(Duration(days: 1)); + final url = + '$_rootUrl/id/stations/$stationId/readings?since=${dateTime.toIso8601String()}'; + final response = await http.get(Uri.parse(url)); + if (response.statusCode == 200) { + final Map jsonStr = jsonDecode(response.body); + for (final str in jsonStr['items']) { + readings.add(Reading.fromMap(str)); + } + } + return readings; + } }