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(
maxHeight: isMobile ? 240 : 280,
),
child: ListView.separated(
child: ListView.builder(
shrinkWrap: true,
itemCount: _searchResults.length,
physics: const ClampingScrollPhysics(),
separatorBuilder: (context, index) =>
const SizedBox(height: 8),
// ✅ prototypeItem : les résultats ont une hauteur variable
// 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) {
final event = _searchResults[index];
final isSelected = _selectedEvent?.id == event.id;
final isLast = index == _searchResults.length - 1;
return Material(
return Column(
mainAxisSize: MainAxisSize.min,
children: [
Material(
color: isSelected
? AppColors.rouge.withOpacity(0.08)
: 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(
controller: _scrollController,
itemCount: itemCount,
// ✅ Ajouter une estimation de la hauteur pour améliorer le scroll
// Note : À ajuster selon la hauteur réelle de vos cartes
// itemExtent: 140, // Décommentez si toutes les cartes ont la même hauteur
// ✅ prototypeItem utilisé car les cartes ont des hauteurs variables :
// - Les équipements standards (ListTile + margin) font ~88px
// - 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
cacheExtent: 500, // Précharger 500px en plus
itemBuilder: (context, index) {