LazyList
Listes & défilement
Le ListView.builder de Flutter, adapté à un pipeline requête/réponse qui n'a pas de connexion persistante permettant de construire un item au fil du scroll. Au lieu de construire les $itemCount items à chaque requête, ce nœud n'appelle $itemBuilder que pour les indices compris dans [scrollY - buffer, scrollY + viewportHeight + buffer] — une fenêtre de préchargement, pas une paresse image par image — tout en déclarant la hauteur virtuelle complète (itemCount * itemHeight) comme Size du nœud, afin que la barre de scroll côté Android couvre bien toute la liste même si la plupart des items n'ont jamais été construits.
Exemple
<?php
use Engine\Native\LazyList;
use Engine\Native\Padding;
use Engine\Native\Text;
use Engine\Native\EdgeInsets;
use Engine\Native\Tokens;
$builder = static function (int $index): Widget {
return new Padding(
EdgeInsets::all(Tokens::SPACE_MD),
new Text("Ligne #{$index}", Tokens::TEXT_BODY, Tokens::ink()->toHex()),
);
};
$list = new LazyList(
itemCount: 5000,
itemBuilder: $builder,
itemHeight: 56.0,
scrollY: (float) ($_GET['scroll_y'] ?? 0),
viewportHeight: (float) ($_GET['height'] ?? 800),
bufferViewports: 2.0,
);Une liste virtuelle de 5000 lignes de 56px chacune ; seules les lignes proches de la position de scroll courante (± 2 écrans) sont réellement construites à chaque requête.
Constructeur
| Paramètre | Type | Défaut | Description |
|---|---|---|---|
| itemCount | int | — | Nombre total d'items de la liste virtuelle. |
| itemBuilder | \Closure (callable(int): Widget) | — | Fonction appelée avec l'index de chaque item visible ; ne construit que la fenêtre autour du scroll courant. |
| itemHeight | float | — | Hauteur fixe de chaque item, nécessaire pour calculer la hauteur virtuelle totale et la position absolue de chaque item. |
| scrollY | float | — | Position de scroll courante, à faire suivre depuis $_GET['scroll_y']. |
| viewportHeight | float | — | Hauteur visible de l'écran, utilisée avec scrollY pour calculer la fenêtre à construire. |
| bufferViewports | float | 2.0 | Marge de préchargement de part et d'autre de la fenêtre visible, exprimée en multiples de viewportHeight. |
À savoir. Chaque item doit avoir une hauteur fixe (
itemHeight) — pas de hauteur intrinsèque variable — c'est la seule façon de connaître la hauteur totale et la position Y absolue d'un item sans devoir tous les mettre en page. Pensez à appelerCanvas::setScrollFollow()côté écran pour que le client refasse une requête quand l'utilisateur approche du bord de la fenêtre chargée.