fix(tours): Reload/Neustart behaelt gewaehltes Datum (kein Sprung auf heute)

Der Header-Kalender zeigte nach Neustart/Retry noch 'morgen', geladen wurde
aber 'heute' (leer). Ursache: Initial-Load und diverse Retry-Buttons
dispatchten LoadTour() ohne Datum -> immer heute.

- LoadTour(): reiner Reload, behaelt das gemerkte Datum
- LoadTour.forDate(date): setzt gezielt ein Datum (Kalender + Initial-Load)
- Initial-Load in home.dart liest das Datum aus dem TourDateCubit
- Retry-Buttons (Fail-/Sort-/Loading-Seite) laden dadurch den angezeigten Tag

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dennis Nemec
2026-09-01 16:06:58 +02:00
parent 83d52364a5
commit 633b7631aa
4 changed files with 35 additions and 12 deletions

View File

@ -80,7 +80,9 @@ class TourBloc extends Bloc<TourEvent, TourState> {
// ─── LoadTour ──────────────────────────────────────────────────────── // ─── LoadTour ────────────────────────────────────────────────────────
Future<void> _onLoad(LoadTour event, Emitter<TourState> emit) async { Future<void> _onLoad(LoadTour event, Emitter<TourState> emit) async {
_selectedDate = event.date; // Nur bei explizit gesetztem Datum die Wahl aktualisieren; ein reiner
// Reload (LoadTour()) behält den aktuell angezeigten Tag.
if (event.hasDate) _selectedDate = event.date;
emit(const TourLoading()); emit(const TourLoading());
try { try {
final details = await tourRepository.getMyTourDetails(date: _selectedDate); final details = await tourRepository.getMyTourDetails(date: _selectedDate);
@ -103,9 +105,9 @@ class TourBloc extends Bloc<TourEvent, TourState> {
Future<void> _onRefresh(RefreshTour event, Emitter<TourState> emit) async { Future<void> _onRefresh(RefreshTour event, Emitter<TourState> emit) async {
final current = state; final current = state;
if (current is! TourLoaded) { if (current is! TourLoaded) {
// Keine sichtbare Tour zum „weichen" Refreshen — wie ein LoadTour // Keine sichtbare Tour zum „weichen" Refreshen — wie ein Reload
// behandeln. Das aktuell gewählte Datum beibehalten. // behandeln. `const LoadTour()` behält das aktuell gewählte Datum.
await _onLoad(LoadTour(date: _selectedDate), emit); await _onLoad(const LoadTour(), emit);
return; return;
} }

View File

@ -7,16 +7,28 @@ sealed class TourEvent {
const TourEvent(); const TourEvent();
} }
/// Initial-Load bzw. Laden der Tour des angemeldeten Fahrers für ein /// Lädt die Tour des angemeldeten Fahrers. Account-Filter sitzt im JWT.
/// bestimmtes Datum. Account-Filter sitzt im JWT.
/// ///
/// [date] `null` = „heute" (Server entscheidet). Wählt der Fahrer im /// Zwei Spielarten:
/// Kopf-Kalender ein Datum, wird es hier übergeben und der Bloc merkt es /// * [LoadTour] (ohne Datum): **Reload/Retry** — lädt den aktuell im Bloc
/// sich für nachfolgende [RefreshTour]-Events. /// gemerkten Tag erneut und ändert die Datumswahl NICHT. Für Retry-Buttons
/// und Fehler-Seiten, die sonst versehentlich auf „heute" zurückspringen.
/// * [LoadTour.forDate]: setzt gezielt ein Datum (`null` = heute) und merkt
/// es sich als aktuelles Datum für nachfolgende Reloads/Refreshes. Für den
/// Kopf-Kalender und den Initial-Load (aus dem [TourDateCubit]).
class LoadTour extends TourEvent { class LoadTour extends TourEvent {
const LoadTour({this.date}); const LoadTour()
: date = null,
hasDate = false;
const LoadTour.forDate(this.date) : hasDate = true;
/// Ziel-Datum, nur relevant wenn [hasDate] `true` ist. `null` = heute.
final DateTime? date; final DateTime? date;
/// `true` = [date] wurde bewusst gesetzt; `false` = „aktuelles Datum
/// behalten" (reiner Reload).
final bool hasDate;
} }
/// Pull-to-refresh / manueller Reload aus der Übersicht. Vorhandener /// Pull-to-refresh / manueller Reload aus der Übersicht. Vorhandener

View File

@ -9,6 +9,7 @@ import 'package:hl_lieferservice/feature/delivery/bloc/phase_bloc.dart';
import 'package:hl_lieferservice/feature/delivery/bloc/phase_event.dart'; import 'package:hl_lieferservice/feature/delivery/bloc/phase_event.dart';
import 'package:hl_lieferservice/feature/delivery/bloc/phase_state.dart'; import 'package:hl_lieferservice/feature/delivery/bloc/phase_state.dart';
import 'package:hl_lieferservice/feature/delivery/bloc/tour_bloc.dart'; import 'package:hl_lieferservice/feature/delivery/bloc/tour_bloc.dart';
import 'package:hl_lieferservice/feature/delivery/bloc/tour_date_cubit.dart';
import 'package:hl_lieferservice/feature/delivery/bloc/tour_event.dart'; import 'package:hl_lieferservice/feature/delivery/bloc/tour_event.dart';
import 'package:hl_lieferservice/feature/delivery/bloc/tour_state.dart'; import 'package:hl_lieferservice/feature/delivery/bloc/tour_state.dart';
import 'package:hl_lieferservice/feature/delivery/model/delivery_phase.dart'; import 'package:hl_lieferservice/feature/delivery/model/delivery_phase.dart';
@ -52,7 +53,15 @@ class _HomeState extends State<Home> {
// Tour beim ersten Aufbau laden. Account-Filter sitzt jetzt // Tour beim ersten Aufbau laden. Account-Filter sitzt jetzt
// serverseitig im JWT — kein Personalnummer-Argument mehr nötig. // serverseitig im JWT — kein Personalnummer-Argument mehr nötig.
context.read<TourBloc>().add(const LoadTour()); //
// Das im Kopf-Kalender gewählte Datum berücksichtigen: bleibt der
// TourDateCubit über einen (Warm-)Neustart bestehen (Header zeigt z. B.
// noch „Morgen"), muss der Initial-Load DENSELBEN Tag laden — sonst
// klaffen Anzeige (Morgen) und geladene Daten (Heute) auseinander.
// `null` = heute (Server entscheidet), also unverändertes Default.
context
.read<TourBloc>()
.add(LoadTour.forDate(context.read<TourDateCubit>().state));
// CarsBloc auch hier triggern: wenn der CarSelectBloc beim App-Start // CarsBloc auch hier triggern: wenn der CarSelectBloc beim App-Start
// eine valide Tages-Auswahl aus den SharedPreferences fand, wurde die // eine valide Tages-Auswahl aus den SharedPreferences fand, wurde die

View File

@ -441,7 +441,7 @@ class _SelectedDatePill extends StatelessWidget {
); );
if (picked == null || !context.mounted) return; if (picked == null || !context.mounted) return;
context.read<TourDateCubit>().pick(picked); context.read<TourDateCubit>().pick(picked);
context.read<TourBloc>().add(LoadTour(date: picked)); context.read<TourBloc>().add(LoadTour.forDate(picked));
} }
} }