feat(retry): jeder dynamisch geladene Request hat im Fehlerfall einen Retry
Inventur aller Lese-Requests (Tour, Fahrzeuge, Zahlungsmethoden,
Foto-Vorschauen) und aller Stellen, an denen ihr Fehlerzustand gerendert wird.
Geschlossene Luecken:
- Sortieren-Seite: TourLoadFailed fiel in den Lade-Zweig -> Endlos-Spinner
ohne Ausweg. Jetzt Fehlerseite mit 'Erneut versuchen' im Header-Rahmen
- Home: scheiterte beim Start CarLoad oder LoadTour, wurde die Phase nie
geladen -> Endlos-Spinner. Jetzt Fehlerseite mit Retry (+ Drawer)
- Beladen-/Auswaehlen-Seite: Fehlerseite stand ohne Scaffold/Header/Drawer
da; jetzt im selben Rahmen wie die uebrigen Zustaende
- Hintergrund-Reload (refreshError): Snackbar jetzt MIT Retry-Aktion und
zentral im PhaseStepper-Header -> gilt in allen Phasen (vorher nur
Ausliefern, ohne Retry; auf Sortieren/Beladen blieb der Fehler stumm)
- AttachmentImage: Fehleranzeige ist antippbar ('Erneut laden')
Zahlungsmethoden haben den Retry bereits aus dem vorigen Commit.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
@ -64,6 +64,14 @@ class _AttachmentImageState extends State<AttachmentImage> {
|
||||
}
|
||||
}
|
||||
|
||||
/// Stößt den Download nach einem Fehler erneut an (Tipp auf die
|
||||
/// Fehleranzeige). Ein fehlgeschlagener Bild-Load ist kein Endzustand.
|
||||
void _retry() {
|
||||
setState(() {
|
||||
_future = _load();
|
||||
});
|
||||
}
|
||||
|
||||
static const _ext = 'jpeg';
|
||||
|
||||
Future<Uint8List> _load() async {
|
||||
@ -133,12 +141,42 @@ class _AttachmentImageState extends State<AttachmentImage> {
|
||||
if (snapshot.hasError ||
|
||||
snapshot.data == null ||
|
||||
snapshot.data!.isEmpty) {
|
||||
// Laden fehlgeschlagen (Netz/VPN/Server): Tippen lädt erneut.
|
||||
// Bewusst GestureDetector statt InkWell — das Widget wird auch
|
||||
// ohne Material-Vorfahren (Vollbild-Ansicht) verwendet.
|
||||
return Center(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(16),
|
||||
child: Icon(
|
||||
Icons.broken_image_outlined,
|
||||
color: theme.colorScheme.onSurfaceVariant,
|
||||
child: GestureDetector(
|
||||
behavior: HitTestBehavior.opaque,
|
||||
onTap: _retry,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(12),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Icon(
|
||||
Icons.broken_image_outlined,
|
||||
color: theme.colorScheme.onSurfaceVariant,
|
||||
),
|
||||
const SizedBox(height: 4),
|
||||
Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Icon(
|
||||
Icons.refresh,
|
||||
size: 14,
|
||||
color: theme.colorScheme.primary,
|
||||
),
|
||||
const SizedBox(width: 4),
|
||||
Text(
|
||||
'Erneut laden',
|
||||
style: theme.textTheme.labelSmall?.copyWith(
|
||||
color: theme.colorScheme.primary,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user