refactoring
This commit is contained in:
142
lib/presentation/screens/friends/friends_screen.dart
Normal file
142
lib/presentation/screens/friends/friends_screen.dart
Normal file
@@ -0,0 +1,142 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import '../../../data/providers/friends_provider.dart';
|
||||
import '../../widgets/friend_detail_screen.dart';
|
||||
import '../../widgets/friends_circle.dart';
|
||||
import '../../widgets/search_friends.dart';
|
||||
|
||||
/// [FriendsScreen] est l'écran principal permettant d'afficher et de gérer la liste des amis.
|
||||
/// Il inclut des fonctionnalités de pagination, de recherche, et de rafraîchissement manuel de la liste.
|
||||
class FriendsScreen extends StatefulWidget {
|
||||
final String userId; // Identifiant de l'utilisateur pour récupérer ses amis
|
||||
|
||||
const FriendsScreen({Key? key, required this.userId}) : super(key: key);
|
||||
|
||||
@override
|
||||
_FriendsScreenState createState() => _FriendsScreenState();
|
||||
}
|
||||
|
||||
class _FriendsScreenState extends State<FriendsScreen> {
|
||||
late ScrollController _scrollController;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
// Initialisation du contrôleur de défilement pour la gestion de la pagination.
|
||||
_scrollController = ScrollController();
|
||||
_scrollController.addListener(_onScroll);
|
||||
|
||||
// Log pour indiquer le début du chargement des amis
|
||||
debugPrint("[LOG] Initialisation de la page : chargement des amis pour l'utilisateur ${widget.userId}");
|
||||
// Chargement initial de la liste d'amis
|
||||
Provider.of<FriendsProvider>(context, listen: false).fetchFriends(widget.userId);
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
// Nettoyage du contrôleur de défilement pour éviter les fuites de mémoire.
|
||||
_scrollController.removeListener(_onScroll);
|
||||
_scrollController.dispose();
|
||||
super.dispose();
|
||||
debugPrint("[LOG] Dispose : contrôleur de défilement supprimé");
|
||||
}
|
||||
|
||||
/// Méthode déclenchée lors du défilement de la liste.
|
||||
/// Vérifie si l'utilisateur a atteint le bas de la liste pour charger plus d'amis.
|
||||
void _onScroll() {
|
||||
final provider = Provider.of<FriendsProvider>(context, listen: false);
|
||||
if (_scrollController.position.pixels == _scrollController.position.maxScrollExtent &&
|
||||
!provider.isLoading && provider.hasMore) {
|
||||
debugPrint("[LOG] Scroll : fin de liste atteinte, chargement de la page suivante");
|
||||
// Charger plus d'amis si on atteint la fin de la liste
|
||||
provider.fetchFriends(widget.userId);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
// Accès au fournisseur pour gérer les données et les états des amis.
|
||||
final friendsProvider = Provider.of<FriendsProvider>(context, listen: false);
|
||||
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: const Text('Mes Amis'),
|
||||
actions: [
|
||||
IconButton(
|
||||
icon: const Icon(Icons.refresh),
|
||||
onPressed: () {
|
||||
// Log de l'action de rafraîchissement
|
||||
debugPrint("[LOG] Bouton Refresh : demande de rafraîchissement de la liste des amis");
|
||||
// Rafraîchir la liste des amis
|
||||
friendsProvider.fetchFriends(widget.userId);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
body: SafeArea(
|
||||
child: Column(
|
||||
children: [
|
||||
const Padding(
|
||||
padding: EdgeInsets.all(8.0),
|
||||
// Widget pour la recherche d'amis
|
||||
child: SearchFriends(),
|
||||
),
|
||||
Expanded(
|
||||
// Construction de la liste d'amis basée sur l'état du FriendsProvider
|
||||
child: Consumer<FriendsProvider>(
|
||||
builder: (context, friendsProvider, child) {
|
||||
// Si le chargement est en cours et qu'il n'y a aucun ami, afficher un indicateur de chargement.
|
||||
if (friendsProvider.isLoading && friendsProvider.friendsList.isEmpty) {
|
||||
debugPrint("[LOG] Chargement : affichage de l'indicateur de progression");
|
||||
return const Center(child: CircularProgressIndicator());
|
||||
}
|
||||
|
||||
// Si la liste est vide après le chargement, afficher un message indiquant qu'aucun ami n'a été trouvé.
|
||||
if (friendsProvider.friendsList.isEmpty) {
|
||||
debugPrint("[LOG] Liste vide : Aucun ami trouvé");
|
||||
return const Center(
|
||||
child: Text('Aucun ami trouvé'),
|
||||
);
|
||||
}
|
||||
|
||||
// Affichage de la grille des amis
|
||||
debugPrint("[LOG] Affichage de la grille des amis (nombre d'amis : ${friendsProvider.friendsList.length})");
|
||||
|
||||
return GridView.builder(
|
||||
controller: _scrollController,
|
||||
padding: const EdgeInsets.all(16),
|
||||
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
|
||||
crossAxisCount: 3,
|
||||
mainAxisSpacing: 10,
|
||||
crossAxisSpacing: 10,
|
||||
),
|
||||
itemCount: friendsProvider.friendsList.length,
|
||||
itemBuilder: (context, index) {
|
||||
final friend = friendsProvider.friendsList[index];
|
||||
debugPrint("[LOG] Affichage de l'ami à l'index $index avec ID : ${friend.friendId}");
|
||||
|
||||
return FriendsCircle(
|
||||
friend: friend,
|
||||
onTap: () {
|
||||
// Log pour l'action de visualisation des détails d'un ami
|
||||
debugPrint("[LOG] Détail : Affichage des détails de l'ami ID : ${friend.friendId}");
|
||||
// Naviguer vers l'écran des détails de l'ami
|
||||
FriendDetailScreen.open(
|
||||
context,
|
||||
friend.friendId,
|
||||
friend.firstName ?? 'Ami inconnu',
|
||||
friend.imageUrl ?? '',
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user