ListView.separated(
itemCount: cities.length,
itemBuilder: (context, index) {
final city = cities[index];
return ListTile(
title: Text(city.name),
onTap: () { /* Navigation, siehe unten */ },
);
},
separatorBuilder: (context, index) => const Divider(height: 1),
)Der Navigator verwaltet einen Stapel von Screens (Routes).
Navigator.push(…)Navigator.pop(context)onTap: () => Navigator.push(
context,
MaterialPageRoute(builder: (context) => WeatherScreen(city: city)),
),Jeder Wetter-Screen erzeugt sein eigenes ViewModel und lädt das Wetter in initState.
class _WeatherScreenState extends State<WeatherScreen> {
final _viewModel = WeatherViewModel();
@override
void initState() {
super.initState();
_viewModel.loadWeather(widget.city);
}
// dispose() und build() wie bisher
}Aufgabe für den Agent: ein ApiWeatherRepository für Open-Meteo bauen und im ViewModel einsetzen.
flutter analyze, App testenPakete kommen von pub.dev und werden mit flutter pub add eingebunden.
final uri = Uri.https('api.open-meteo.com', '/v1/forecast', {
'latitude': '${city.latitude}',
'longitude': '${city.longitude}',
'current': 'temperature_2m,weather_code,wind_speed_10m',
});
final response = await _client.get(uri);
if (response.statusCode != 200) {
throw Exception('HTTP-Fehler ${response.statusCode}');
}
final json = jsonDecode(utf8.decode(response.bodyBytes));
return ForecastResponse.fromJson(json).current.toCurrentWeather();Die JSON-Antwort bekommt eigene Klassen (DTOs). Sie werden auf unser Datenmodell abgebildet.
class CurrentDto {
// const-Konstruktor und final-Felder ...
factory CurrentDto.fromJson(Map<String, dynamic> json) => CurrentDto(
temperature: (json['temperature_2m'] as num).toDouble(),
weatherCode: json['weather_code'] as int,
windSpeed: (json['wind_speed_10m'] as num).toDouble(),
);
}Für echte Daten wurde kein einziges Widget geändert.
$ git diff --stat schritt-08 schritt-09
android/app/src/main/AndroidManifest.xml | 2 ++
lib/data/api/open_meteo_dto.dart | 31 ++++++++++
lib/data/api_weather_repository.dart | 52 ++++++++++++++++
lib/ui/weather_view_model.dart | 4 +-
pubspec.lock | 32 ++++++++++
pubspec.yaml | 1 +Selbst oder mit einem Coding Agent umsetzen, jeweils Plan und Diff prüfen.
FakeWeatherRepository