perf: ajout de ListView itemExtent/prototypeItem pour l'optimisation des performances

This commit is contained in:
ElPoyo
2026-05-26 13:43:18 +02:00
parent 0bbc77ffc8
commit 4284142b1e
2 changed files with 79 additions and 65 deletions
+16 -4
View File
@@ -601,17 +601,26 @@ class _CalendarPageState extends State<CalendarPage> {
constraints: BoxConstraints( constraints: BoxConstraints(
maxHeight: isMobile ? 240 : 280, maxHeight: isMobile ? 240 : 280,
), ),
child: ListView.separated( child: ListView.builder(
shrinkWrap: true, shrinkWrap: true,
itemCount: _searchResults.length, itemCount: _searchResults.length,
physics: const ClampingScrollPhysics(), physics: const ClampingScrollPhysics(),
separatorBuilder: (context, index) => // ✅ prototypeItem : les résultats ont une hauteur variable
const SizedBox(height: 8), // selon la présence du champ adresse (~56px sans, ~70px avec).
// prototypeItem à 72px (cas avec adresse + padding) pour
// que Flutter estime correctement la hauteur scrollable.
// ListView.separated ne supporte pas itemExtent/prototypeItem,
// d'où la conversion en ListView.builder avec séparateur intégré.
prototypeItem: const SizedBox(height: 72),
itemBuilder: (context, index) { itemBuilder: (context, index) {
final event = _searchResults[index]; final event = _searchResults[index];
final isSelected = _selectedEvent?.id == event.id; final isSelected = _selectedEvent?.id == event.id;
final isLast = index == _searchResults.length - 1;
return Material( return Column(
mainAxisSize: MainAxisSize.min,
children: [
Material(
color: isSelected color: isSelected
? AppColors.rouge.withOpacity(0.08) ? AppColors.rouge.withOpacity(0.08)
: Colors.white, : Colors.white,
@@ -675,6 +684,9 @@ class _CalendarPageState extends State<CalendarPage> {
), ),
), ),
), ),
),
if (!isLast) const SizedBox(height: 8),
],
); );
}, },
), ),
@@ -501,9 +501,11 @@ class _EquipmentManagementPageState extends State<EquipmentManagementPage>
return ListView.builder( return ListView.builder(
controller: _scrollController, controller: _scrollController,
itemCount: itemCount, itemCount: itemCount,
// ✅ Ajouter une estimation de la hauteur pour améliorer le scroll // ✅ prototypeItem utilisé car les cartes ont des hauteurs variables :
// Note : À ajuster selon la hauteur réelle de vos cartes // - Les équipements standards (ListTile + margin) font ~88px
// itemExtent: 140, // Décommentez si toutes les cartes ont la même hauteur // - Les consommables/câbles affichent _buildQuantityDisplay en plus (~30px)
// - prototypeItem permet à Flutter d'optimiser le scroll sans couper les items
prototypeItem: const SizedBox(height: 88),
// ✅ Augmenter le cache pour un scroll plus fluide // ✅ Augmenter le cache pour un scroll plus fluide
cacheExtent: 500, // Précharger 500px en plus cacheExtent: 500, // Précharger 500px en plus
itemBuilder: (context, index) { itemBuilder: (context, index) {