import 'package:flutter/material.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; class ProfilePictureWidget extends StatelessWidget { final String userId; final double radius; final String? defaultImageUrl; // URL de l'image par défaut (optionnel) const ProfilePictureWidget({ super.key, required this.userId, this.radius = 25, this.defaultImageUrl, }); @override Widget build(BuildContext context) { return FutureBuilder( future: FirebaseFirestore.instance.collection('users').doc(userId).get(), builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { return _buildLoadingAvatar( radius); // Afficher un avatar de chargement } else if (snapshot.hasError) { print("Erreur FutureBuilder ProfilePictureWidget: ${snapshot.error}"); return _buildDefaultAvatar(radius, defaultImageUrl); // Afficher avatar par défaut en cas d'erreur Firestore } else if (snapshot.data != null && snapshot.data!.exists) { final userData = snapshot.data!; final profilePhotoUrl = userData['profilePhotoUrl'] as String?; if (profilePhotoUrl != null && profilePhotoUrl.isNotEmpty) { return CircleAvatar( radius: radius, // Utilisation de Image.network directement dans backgroundImage backgroundImage: Image.network( profilePhotoUrl, errorBuilder: (context, error, stackTrace) { print( "Erreur de chargement Image.network pour l'URL: $profilePhotoUrl, Erreur: $error"); // En cas d'erreur de chargement de l'image réseau, afficher l'avatar par défaut return _buildDefaultAvatar(radius, defaultImageUrl); }, ).image, // .image pour obtenir un ImageProvider pour backgroundImage ); } else { return _buildDefaultAvatar(radius, defaultImageUrl); // Pas d'URL dans Firestore, afficher avatar par défaut } } else { return _buildDefaultAvatar(radius, defaultImageUrl); // Document utilisateur non trouvé ou n'existe pas } }, ); } // Widget utilitaire pour construire un CircleAvatar de chargement Widget _buildLoadingAvatar(double radius) { return CircleAvatar( radius: radius, backgroundColor: Colors.grey[300], // Couleur de fond pendant le chargement child: SizedBox( width: radius * 0.8, // Ajuster la taille du loader height: radius * 0.8, child: CircularProgressIndicator( strokeWidth: 2), // Indicateur de chargement ), ); } // Widget utilitaire pour construire un CircleAvatar par défaut (avec icône ou image par défaut) Widget _buildDefaultAvatar(double radius, String? defaultImageUrl) { if (defaultImageUrl != null && defaultImageUrl.isNotEmpty) { return CircleAvatar( radius: radius, // Utilisation de Image.network pour l'image par défaut, avec gestion d'erreur similaire backgroundImage: Image.network( defaultImageUrl, errorBuilder: (context, error, stackTrace) { print( "Erreur de chargement Image.network pour l'URL par défaut: $defaultImageUrl, Erreur: $error"); return _buildIconAvatar( radius); // Si l'image par défaut ne charge pas, afficher l'icône }, ).image, // .image pour ImageProvider ); } else { return _buildIconAvatar( radius); // Si pas d'URL par défaut fournie, afficher l'icône } } // Widget utilitaire pour construire un CircleAvatar avec une icône par défaut Widget _buildIconAvatar(double radius) { return CircleAvatar( radius: radius, child: Icon(Icons.account_circle, size: radius * 1.5), // Icône par défaut ); } }