From 5dfd28c56b4cc34f0b517a2b1fea254ba9ce7ec3 Mon Sep 17 00:00:00 2001 From: Constantin Leue <77660791+Consti3D@users.noreply.github.com> Date: Sun, 2 Aug 2026 22:23:49 +0200 Subject: [PATCH] fit map bug behoben fuer plan modus --- .../ui/providers/map_controller_provider.dart | 44 ++++++++++++------- .../ui/providers/mission_meta_provider.dart | 17 +++---- 2 files changed, 33 insertions(+), 28 deletions(-) diff --git a/app/lib/ui/providers/map_controller_provider.dart b/app/lib/ui/providers/map_controller_provider.dart index 3052bb5..858320d 100644 --- a/app/lib/ui/providers/map_controller_provider.dart +++ b/app/lib/ui/providers/map_controller_provider.dart @@ -25,22 +25,34 @@ final mapControllerProvider = Provider((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 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 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 waypoints) => + fitMapControllerToWaypoints(ref.read(mapControllerProvider), waypoints); diff --git a/app/lib/ui/providers/mission_meta_provider.dart b/app/lib/ui/providers/mission_meta_provider.dart index cc5c534..2a82851 100644 --- a/app/lib/ui/providers/mission_meta_provider.dart +++ b/app/lib/ui/providers/mission_meta_provider.dart @@ -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 { /// 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 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