Implemented way to fetch stations in batches

This commit is contained in:
2025-01-27 19:14:58 +01:00
parent 5df67920ea
commit 9e37ebbc22
2 changed files with 38 additions and 3 deletions

View File

@@ -8,7 +8,7 @@ class Api {
static const String _rootUrl = static const String _rootUrl =
'https://environment.data.gov.uk/flood-monitoring'; 'https://environment.data.gov.uk/flood-monitoring';
static Future<List<FloodStation>> fetchStations() async { static Future<List<FloodStation>> fetchAllStations() async {
List<FloodStation> stations = []; List<FloodStation> stations = [];
final response = await http.get(Uri.parse('$_rootUrl/id/stations')); final response = await http.get(Uri.parse('$_rootUrl/id/stations'));
if (response.statusCode == 200) { if (response.statusCode == 200) {
@@ -20,6 +20,23 @@ class Api {
return stations; return stations;
} }
/// [limit] limits the number of entries that are requested from the API and [offset] returns the
/// list starting from the specified number
static Future<List<FloodStation>> fetchStationsByRange(
int limit, int offset) async {
List<FloodStation> stations = [];
final response = await http
.get(Uri.parse('$_rootUrl/id/stations?_limit=$limit&_offset=$offset'));
if (response.statusCode == 200) {
final Map<String, dynamic> jsonStr = jsonDecode(response.body);
for (final str in jsonStr['items']) {
stations.add(FloodStation.fromMap(str));
}
}
return stations;
}
static Future<List<Reading>> fetchReadingsFromStation( static Future<List<Reading>> fetchReadingsFromStation(
String stationId) async { String stationId) async {
List<Reading> readings = []; List<Reading> readings = [];

View File

@@ -4,13 +4,31 @@ import '../model/flood_station.dart';
import 'api.dart'; import 'api.dart';
class FloodStationProvider extends ChangeNotifier { class FloodStationProvider extends ChangeNotifier {
List<FloodStation> _allStations = [];
FloodStation? selectedStation; FloodStation? selectedStation;
List<FloodStation> _allStations = [];
List<FloodStation> get allStations => _allStations; List<FloodStation> get allStations => _allStations;
Future loadAllStationsInBatches({silent = false}) {
int offset = 0;
return Future.doWhile(() async {
final stations = await Api.fetchStationsByRange(500, offset);
if (stations.isNotEmpty) {
_allStations.addAll(stations);
if (!silent) {
notifyListeners();
}
offset += 500;
return true;
} else {
return false;
}
});
}
Future loadAllStations({silent = false}) { Future loadAllStations({silent = false}) {
return Api.fetchStations().then( return Api.fetchAllStations().then(
(value) { (value) {
_allStations = value; _allStations = value;
if (!silent) { if (!silent) {