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), );