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:
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user