fix(home): neu gesyncte Lieferungen bekommen assignedCarId beim Reload

_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) <noreply@anthropic.com>
This commit is contained in:
Dennis Nemec
2026-07-10 23:06:12 +02:00
parent 30fdde1109
commit bc15ac2802

View File

@ -36,8 +36,15 @@ class _HomeState extends State<Home> {
String? _initializedCarId; String? _initializedCarId;
/// Merkt, für welches Auto die automatische Lieferungs-Zuordnung bereits /// Merkt, für welches Auto die automatische Lieferungs-Zuordnung bereits
/// erledigt ist (Ein-Auto-Teams, s. [_ensureSingleCarAssignment]). /// Auto, für das zuletzt automatisch zugewiesen wurde (Ein-Auto-Teams).
String? _autoAssignedForCar; 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<String> _autoAssignDispatched = {};
@override @override
void initState() { void initState() {
@ -84,19 +91,27 @@ class _HomeState extends State<Home> {
/// Mehrfachausführung gesichert. Greift erst, wenn Tour UND Cars geladen /// Mehrfachausführung gesichert. Greift erst, wenn Tour UND Cars geladen
/// sind (sonst Abbruch ohne Flag → erneuter Versuch beim nächsten Build). /// sind (sonst Abbruch ohne Flag → erneuter Versuch beim nächsten Build).
void _ensureSingleCarAssignment(String carId) { void _ensureSingleCarAssignment(String carId) {
if (_autoAssignedForCar == carId) return;
final carsState = context.read<CarsBloc>().state; final carsState = context.read<CarsBloc>().state;
final tourState = context.read<TourBloc>().state; final tourState = context.read<TourBloc>().state;
if (carsState is! CarsLoaded || tourState is! TourLoaded) return; if (carsState is! CarsLoaded || tourState is! TourLoaded) return;
_autoAssignedForCar = carId;
// Nur Ein-Auto-Teams: bei ≥2 Fahrzeugen entscheidet der Fahrer aktiv in // Nur Ein-Auto-Teams: bei ≥2 Fahrzeugen entscheidet der Fahrer aktiv in
// der „Auswählen"-Phase, hier wird bewusst nichts automatisch zugewiesen. // der „Auswählen"-Phase, hier wird bewusst nichts automatisch zugewiesen.
if (carsState.cars.length != 1) return; if (carsState.cars.length != 1) return;
// Fahrzeugwechsel → Tracking zurücksetzen.
if (_autoAssignCar != carId) {
_autoAssignCar = carId;
_autoAssignDispatched.clear();
}
final tourBloc = context.read<TourBloc>(); final tourBloc = context.read<TourBloc>();
for (final delivery in tourState.details.deliveries) { 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( tourBloc.add(
AssignCarToDelivery(deliveryId: delivery.id, carId: carId), AssignCarToDelivery(deliveryId: delivery.id, carId: carId),
); );