Initialisation du projet geosector complet (web + flutter)

This commit is contained in:
d6soft
2025-05-01 18:59:27 +02:00
commit b5aafc424b
244 changed files with 37296 additions and 0 deletions

View File

@@ -0,0 +1,88 @@
import 'package:flutter/material.dart';
/// Widget d'overlay de chargement qui affiche un spinner centré avec un message optionnel
/// Utilisé pour les opérations longues comme la connexion, déconnexion et synchronisation
class LoadingOverlay extends StatelessWidget {
final String? message;
final Color backgroundColor;
final Color spinnerColor;
final Color textColor;
final double spinnerSize;
final double strokeWidth;
const LoadingOverlay({
Key? key,
this.message,
this.backgroundColor = Colors.black54,
this.spinnerColor = Colors.white,
this.textColor = Colors.white,
this.spinnerSize = 60.0,
this.strokeWidth = 5.0,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
color: backgroundColor,
child: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
SizedBox(
width: spinnerSize,
height: spinnerSize,
child: CircularProgressIndicator(
valueColor: AlwaysStoppedAnimation<Color>(spinnerColor),
strokeWidth: strokeWidth,
),
),
if (message != null) ...[ // Afficher le texte seulement si message n'est pas null
const SizedBox(height: 24),
Text(
message!,
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
color: textColor,
),
textAlign: TextAlign.center,
),
],
],
),
),
);
}
/// Méthode statique pour afficher l'overlay de chargement
static Future<T> show<T>({
required BuildContext context,
required Future<T> future,
String? message,
double spinnerSize = 60.0,
double strokeWidth = 5.0,
}) async {
// Afficher l'overlay
final overlayEntry = OverlayEntry(
builder: (context) => LoadingOverlay(
message: message,
spinnerSize: spinnerSize,
strokeWidth: strokeWidth,
),
);
Overlay.of(context).insert(overlayEntry);
try {
// Attendre que le future se termine
final result = await future;
// Supprimer l'overlay
overlayEntry.remove();
return result;
} catch (e) {
// En cas d'erreur, supprimer l'overlay et relancer l'erreur
overlayEntry.remove();
rethrow;
}
}
}