Skip to content

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
<?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ètreTypeDéfautDescription
itemCountint—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.
itemHeightfloat—Hauteur fixe de chaque item, nécessaire pour calculer la hauteur virtuelle totale et la position absolue de chaque item.
scrollYfloat—Position de scroll courante, à faire suivre depuis $_GET['scroll_y'].
viewportHeightfloat—Hauteur visible de l'écran, utilisée avec scrollY pour calculer la fenêtre à construire.
bufferViewportsfloat2.0Marge 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 à appeler Canvas::setScrollFollow() côté écran pour que le client refasse une requête quand l'utilisateur approche du bord de la fenêtre chargée.

Voir aussi ​

PhpNitro est un produit FINANFA TECH — Publié sous licence MIT.