From bc15ac280259d209ac363bc75d63b1941996a7f4 Mon Sep 17 00:00:00 2001 From: Dennis Nemec Date: Fri, 10 Jul 2026 23:06:12 +0200 Subject: [PATCH] fix(home): neu gesyncte Lieferungen bekommen assignedCarId beim Reload MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit _ensureSingleCarAssignment lief nur EINMAL pro Session (bool-Guard je Auto). Eine nach dem ersten Auto-Assign gesyncte Lieferung (Reload/Pull-to-Refresh) bekam daher kein assignedCarId mehr und erschien erst nach App-Neustart in der Auslieferung. Jetzt wird jede (auch neu dazugekommene) noch nicht zugeordnete Lieferung genau einmal zugewiesen (Set dispatchter Ids statt bool), ohne die laufende Zuweisung bei jedem Build zu respammen. Ergänzt den Anzeige-Fix 30fdde1 (Auslieferung == Beladen-Filter). Co-Authored-By: Claude Opus 4.8 (1M context) --- lib/widget/home/presentation/home.dart | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/lib/widget/home/presentation/home.dart b/lib/widget/home/presentation/home.dart index d6cd688..3f5eb4c 100644 --- a/lib/widget/home/presentation/home.dart +++ b/lib/widget/home/presentation/home.dart @@ -36,8 +36,15 @@ class _HomeState extends State { String? _initializedCarId; /// Merkt, für welches Auto die automatische Lieferungs-Zuordnung bereits - /// erledigt ist (Ein-Auto-Teams, s. [_ensureSingleCarAssignment]). - String? _autoAssignedForCar; + /// Auto, für das zuletzt automatisch zugewiesen wurde (Ein-Auto-Teams). + String? _autoAssignCar; + + /// Lieferungs-Ids, für die die Auto-Zuweisung bereits ausgelöst wurde. So + /// werden **neu gesyncte** Lieferungen (die beim Reload dazukommen) NACH- + /// träglich zugewiesen, ohne dass eine noch laufende Zuweisung (bis der + /// Server antwortet und `assignedCarId` gesetzt ist) bei jedem Build + /// respammt wird. (s. [_ensureSingleCarAssignment]) + final Set _autoAssignDispatched = {}; @override void initState() { @@ -84,19 +91,27 @@ class _HomeState extends State { /// Mehrfachausführung gesichert. Greift erst, wenn Tour UND Cars geladen /// sind (sonst Abbruch ohne Flag → erneuter Versuch beim nächsten Build). void _ensureSingleCarAssignment(String carId) { - if (_autoAssignedForCar == carId) return; final carsState = context.read().state; final tourState = context.read().state; if (carsState is! CarsLoaded || tourState is! TourLoaded) return; - _autoAssignedForCar = carId; // Nur Ein-Auto-Teams: bei ≥2 Fahrzeugen entscheidet der Fahrer aktiv in // der „Auswählen"-Phase, hier wird bewusst nichts automatisch zugewiesen. if (carsState.cars.length != 1) return; + // Fahrzeugwechsel → Tracking zurücksetzen. + if (_autoAssignCar != carId) { + _autoAssignCar = carId; + _autoAssignDispatched.clear(); + } + final tourBloc = context.read(); for (final delivery in tourState.details.deliveries) { - if (delivery.assignedCarId != carId) { + // Jede (auch NEU gesyncte) noch nicht zugeordnete Lieferung genau einmal + // zuweisen. `Set.add` liefert `false`, wenn schon dispatcht → kein Respam + // in den Builds, bis der Server `assignedCarId` gesetzt hat. + if (delivery.assignedCarId != carId && + _autoAssignDispatched.add(delivery.id)) { tourBloc.add( AssignCarToDelivery(deliveryId: delivery.id, carId: carId), );