fit map bug behoben fuer plan modus

This commit is contained in:
Constantin Leue
2026-08-02 22:23:49 +02:00
parent 2d7c50e030
commit 5dfd28c56b
2 changed files with 33 additions and 28 deletions
@@ -25,22 +25,34 @@ final mapControllerProvider = Provider<MapController>((ref) {
return controller;
});
/// Zentriert die Karte auf die Bounding-Box der uebergebenen Wegpunkte
/// (Doku 3.6, analog fitToWaypoints() im HTML-Demonstrator) - geteilt
/// zwischen dem manuellen Fit-Button (MapSearchControls) und den
/// map-bezogenen Warnungs-Aktionen (Doku 3.10), damit beide Stellen exakt
/// dieselbe Zoom-/Padding-Logik verwenden.
void fitMapToWaypoints(WidgetRef ref, List<Waypoint> waypoints) {
/// Zentriert [controller] auf die Bounding-Box der uebergebenen Wegpunkte
/// (Doku 3.6, analog fitToWaypoints() im HTML-Demonstrator). Nimmt bewusst
/// direkt den [MapController] statt eines Ref/WidgetRef entgegen, damit
/// diese eine Implementierung sowohl aus Widgets (ueber [fitMapToWaypoints]
/// unten) als auch aus Notifiern (CurrentMissionMetaNotifier.
/// _fitMapToWaypoints, WidgetRef und Notifier-Ref sind unterschiedliche,
/// nicht austauschbare Typen) aufgerufen werden kann - vorher gab es hier
/// zwei unabhaengige Kopien der Padding-Logik, die bereits einmal
/// auseinandergelaufen sind (Fit-Button symmetrisch, automatisches Fit beim
/// Missions-Laden noch mit alter Fusszeilen-Aussparung).
void fitMapControllerToWaypoints(MapController controller, List<Waypoint> waypoints) {
if (waypoints.isEmpty) return;
final points = [for (final w in waypoints) LatLng(w.lat, w.lon)];
ref.read(mapControllerProvider).fitCamera(
CameraFit.bounds(
bounds: LatLngBounds.fromPoints(points),
// Symmetrisch statt vorher unten 140 (Reservierung fuer die
// Fusszeile) - der Fit soll den ganzen Bildschirm ausnutzen statt
// dort unnoetig herauszuzoomen (Doku: "Fusszeile wird ausgespart,
// nicht genutzt").
padding: const EdgeInsets.all(50),
),
);
controller.fitCamera(
CameraFit.bounds(
bounds: LatLngBounds.fromPoints(points),
// Symmetrisch statt vorher unten 140 (Reservierung fuer die
// Fusszeile) - der Fit soll den ganzen Bildschirm ausnutzen statt
// dort unnoetig herauszuzoomen (Doku: "Fusszeile wird ausgespart,
// nicht genutzt").
padding: const EdgeInsets.all(50),
),
);
}
/// Bequemlichkeits-Wrapper fuer Aufrufer aus Widgets (Consumer/
/// ConsumerStatefulWidget mit [WidgetRef]) - geteilt zwischen dem manuellen
/// Fit-Button (MapSearchControls/FlyMapControls) und den map-bezogenen
/// Warnungs-Aktionen (Doku 3.10).
void fitMapToWaypoints(WidgetRef ref, List<Waypoint> waypoints) =>
fitMapControllerToWaypoints(ref.read(mapControllerProvider), waypoints);
@@ -1,9 +1,6 @@
import 'dart:async';
import 'package:flutter/widgets.dart';
import 'package:flutter_map/flutter_map.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:latlong2/latlong.dart';
import '../../domain/waypoint/flat_waypoint_list.dart';
import 'current_mission_provider.dart';
@@ -99,16 +96,12 @@ class CurrentMissionMetaNotifier extends Notifier<MissionMeta> {
/// bliebe die Kamera an der zuletzt betrachteten Stelle stehen, waehrend
/// eine voellig andernorts gelegene Mission angezeigt wird. Analog
/// fitToWaypoints() im HTML-Demonstrator bzw. _onFitPressed() in
/// MapSearchControls, hier aber automatisch statt nutzerausgeloest.
/// MapSearchControls, hier aber automatisch statt nutzerausgeloest -
/// nutzt dieselbe Padding-Logik wie der manuelle Fit-Button
/// (fitMapControllerToWaypoints), damit beide nicht wieder auseinander-
/// laufen koennen.
void _fitMapToWaypoints(List<Waypoint> waypoints) {
if (waypoints.isEmpty) return;
final points = [for (final w in waypoints) LatLng(w.lat, w.lon)];
ref.read(mapControllerProvider).fitCamera(
CameraFit.bounds(
bounds: LatLngBounds.fromPoints(points),
padding: const EdgeInsets.fromLTRB(50, 50, 50, 140),
),
);
fitMapControllerToWaypoints(ref.read(mapControllerProvider), waypoints);
}
/// Benennt eine gespeicherte Mission um (Doku 3.6: nur ueber die