Je ne comprends pas comment LayoutBuilder est utilisé pour obtenir la hauteur d'un Widget.
J'ai besoin d'afficher la liste des widgets et d'obtenir leur hauteur afin de pouvoir calculer certains effets de défilement spéciaux. Je développe un paquet et d'autres développeurs fournissent des widgets (je ne les contrôle pas). J'ai lu que LayoutBuilder peut être utilisé pour obtenir la hauteur.
Dans un cas très simple, j'ai essayé d'envelopper le widget dans LayoutBuilder.builder et de le placer dans la pile, mais j'obtiens toujours les résultats suivants minHeight
0.0
et maxHeight
INFINITY
. Est-ce que j'utilise mal le LayoutBuilder ?
EDIT : Il semble que LayoutBuilder soit un échec. J'ai trouvé le CustomSingleChildLayout ce qui est presque une solution.
J'ai étendu ce délégué, et j'ai pu obtenir la hauteur du widget en getPositionForChild(Size size, Size childSize)
méthode. MAIS, la première méthode qui est appelée est Size getSize(BoxConstraints constraints)
et comme contraintes, j'obtiens 0 à INFINITY parce que je pose ces CustomSingleChildLayouts dans une ListView.
Mon problème est que SingleChildLayoutDelegate getSize
fonctionne comme si elle avait besoin de retourner la hauteur d'une vue. Je ne connais pas la hauteur d'un enfant à ce moment-là. Je ne peux que renvoyer constraints.smallest (qui est 0, la hauteur est 0), ou constraints.biggest qui est infini et fait planter l'application.
Dans les docs, il est même dit :
...mais la taille du parent ne peut pas dépendre de la taille de l'enfant.
Et c'est une limitation bizarre.
1 votes
LayoutBuilder vous donnera les contraintes de boîte du parent. Si vous voulez les tailles des enfants, vous devez utiliser une stratégie différente. Un exemple que je peux citer est le widget Wrap, qui effectue la mise en page en fonction de la taille de ses enfants dans la classe RenderWrap associée. Mais cela se produit pendant la mise en page, et non pendant la fonction build().
0 votes
@JonahWilliams Hmm. Je ne vois pas comment Wrap peut m'aider puisque c'est un widget conçu pour disposer les enfants autour (fonctionne quelque chose comme la grille flexbox du web). J'ai un widget enfant dont j'ai besoin de trouver la hauteur. Veuillez voir l'édition dans la question. J'ai presque résolu le problème avec CustomSingleChildLayout mais je suis resté bloqué sur ses limites.
0 votes
Pouvez-vous expliquer plus précisément ce que vous voulez ? Il existe de multiples solutions. Mais chacune a des cas d'utilisation différents.
0 votes
Bien sûr. Je suis en train de développer un paquet. L'utilisateur/développeur fournit un Widget à ma classe. Nous parlons ici de n'importe quel widget, de
new Text("hello")
à d'autres plus complexes. Je place ces widgets dans des ListView, et j'ai besoin de leur hauteur pour calculer certains effets de défilement. Je suis d'accord pour obtenir la hauteur au moment de la mise en page, comme le fait SingleChildLayoutDelegate.0 votes
Qu'entendez-vous par "effets de défilement" ? Avez-vous un exemple ?
0 votes
Quelque chose comme des listes de sticky-headers. J'ai besoin d'une hauteur de lignes pour calculer quelle ligne est en haut, à quelle distance se trouve la ligne suivante, et ensuite faire la translation de la ligne d'en-tête sur l'axe Y qui est dessiné en haut de la liste. J'ai déjà réalisé cela, mais avec la hauteur comme entrée. Je voudrais supprimer ce paramètre de hauteur, afin que l'utilisateur/développeur n'ait pas besoin de connaître la hauteur de chaque ligne.
0 votes
Il y a aussi la question ouverte à github.com/flutter/flutter/issues/16061
0 votes
Je pense que l'utilisation d'un CustomScrollView et de Slivers pourrait être une solution dans ce cas, mais je n'ai pas le temps de l'étudier. La seule chose est qu'il est implémenté pour avoir une seule AppBar en haut ; vous devriez écrire votre propre SliverHeader en suivant l'implémentation de SliverAppBar ou quelque chose comme ça. Le problème avec l'utilisation d'un CustomSingleChildLayout est qu'il dépend de la hauteur des enfants, et doit donc calculer la hauteur totale de la liste à chaque fois, ce qui peut être lent en fonction du nombre de widgets que vous rendez (et impose certaines contraintes sur ces widgets).