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:
@ -36,8 +36,15 @@ class _HomeState extends State<Home> {
|
||||
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<String> _autoAssignDispatched = {};
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
@ -84,19 +91,27 @@ class _HomeState extends State<Home> {
|
||||
/// 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<CarsBloc>().state;
|
||||
final tourState = context.read<TourBloc>().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<TourBloc>();
|
||||
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),
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user