improve asnyc loading and error widgets

This commit is contained in:
Fabian Freund
2026-02-05 15:53:48 +01:00
parent 42c8ad986c
commit c7f9d6ec12
15 changed files with 63 additions and 15 deletions
@@ -362,7 +362,7 @@ class BookmarkListScreen extends HookConsumerWidget {
},
),
),
loading: () => const SizedBox.shrink(),
loading: () => const Center(child: CircularProgressIndicator()),
),
),
),
@@ -156,7 +156,7 @@ class FolderTreePicker extends HookConsumerWidget {
},
),
),
loading: () => const SizedBox.shrink(),
loading: () => const Center(child: CircularProgressIndicator()),
),
],
);
@@ -52,7 +52,14 @@ class TrackingProtectionSection extends HookConsumerWidget {
secondary: const Icon(Icons.shield_outlined),
),
),
error: (error, stack) => const SizedBox.shrink(),
error: (error, stack) {
final colorScheme = Theme.of(context).colorScheme;
return ListTile(
title: const Text('Failed to load tracking protection'),
leading: Icon(Icons.error_outline, color: colorScheme.error),
);
},
);
}
}
@@ -75,7 +75,8 @@ class ReaderButton extends HookConsumerWidget {
readerabilityState.active,
icon,
),
error: (error, stackTrace) => SizedBox.shrink(),
error: (error, stackTrace) =>
Center(child: Icon(Icons.error_outline, color: colorScheme.error)),
loading: () => AnimateGradientShader(
duration: const Duration(milliseconds: 500),
primaryEnd: Alignment.bottomLeft,
@@ -32,6 +32,7 @@ import 'package:weblibre/features/geckoview/features/tabs/domain/providers/selec
import 'package:weblibre/features/geckoview/features/tabs/domain/repositories/container.dart';
import 'package:weblibre/features/geckoview/features/tabs/presentation/widgets/container_list_tile.dart';
import 'package:weblibre/features/tor/presentation/controllers/start_tor_proxy.dart';
import 'package:weblibre/presentation/widgets/failure_widget.dart';
class ContainerListScreen extends HookConsumerWidget {
const ContainerListScreen();
@@ -136,7 +137,13 @@ class ContainerListScreen extends HookConsumerWidget {
);
},
),
error: (error, stackTrace) => SizedBox.shrink(),
error: (error, stackTrace) => Center(
child: FailureWidget(
title: 'Failed to load containers',
exception: error,
onRetry: () => ref.invalidate(watchContainersWithCountProvider),
),
),
loading: () => ListView.builder(
itemCount: 3,
itemBuilder: (context, index) => ContainerListTile(
@@ -30,6 +30,7 @@ import 'package:weblibre/features/geckoview/features/tabs/data/models/container_
import 'package:weblibre/features/geckoview/features/tabs/domain/providers.dart';
import 'package:weblibre/features/geckoview/features/tabs/domain/repositories/container.dart';
import 'package:weblibre/features/geckoview/features/tabs/presentation/widgets/container_list_tile.dart';
import 'package:weblibre/presentation/widgets/failure_widget.dart';
class ContainerSelectionScreen extends HookConsumerWidget {
const ContainerSelectionScreen();
@@ -62,7 +63,13 @@ class ContainerSelectionScreen extends HookConsumerWidget {
);
},
),
error: (error, stackTrace) => SizedBox.shrink(),
error: (error, stackTrace) => Center(
child: FailureWidget(
title: 'Failed to load containers',
exception: error,
onRetry: () => ref.invalidate(watchContainersWithCountProvider),
),
),
loading: () => ListView.builder(
itemCount: 3,
itemBuilder: (context, index) => ContainerListTile(
@@ -256,7 +256,17 @@ class ContainerChips extends HookConsumerWidget {
),
);
},
error: (error, stackTrace) => const SizedBox.shrink(),
error: (error, stackTrace) => SizedBox(
height: 48,
width: double.infinity,
child: Center(
child: Icon(
Icons.error_outline,
size: 20,
color: Theme.of(context).colorScheme.error,
),
),
),
loading: () => const SizedBox(height: 48, width: double.infinity),
);
}